Errno :: EADDRNOTAVAIL beim Senden einer Anfrage an die API von Rails on Docker

Aug 15 2020

Was ich machen will; was ich vorhabe zu tun

Ich möchte die Antwort auf Buchinformationen erhalten, indem ich auf Google Books API von Book Model of Rails klicke

Der aufgetretene Fehler

web_1 | Errno::EADDRNOTAVAIL (Failed to open TCP connection to :80 (Address not available-connect(2) for nil port 80)):
web_1 |
web_1 | app/models/book.rb:24:in `search'
web_1 | app/controllers/books_controller.rb:3:in `search'

Code

Klicken Sie auf die API mit den Schlüsselwörtern (Buchname, Autor usw.), die vom Formular gesendet wurden.

class BooksController <ApplicationController
  def search
    @results = Book.search(params[:book_search][:search_key_word])
  end
end

Da es Nicht-ASCII-Zeichen enthält, wird es mit der url_encodeMethode codiert .

class Book <ApplicationRecord
  class << self
    def search(key_word)
      api_endpoint = ERB::Util.url_encode("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20")
      response = Net::HTTP.get(URI.parse(api_endpoint)) # I'm getting the above error.
      JSON.parse(response)
    end
  end
end

Das Ausführen des Curl-Befehls für denselben Endpunkt liefert natürlich die richtige Antwort.

Hat etwas mit Docker zu tun? Es basiert auf alpinem Linux.https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore

Umgebung

  • Docker 2.3.0.4
  • Docker-Compose 3.8
  • Schienen Container Basis Bild Rubin: 2.6.6-alpin
  • Rubin 2.6.6
  • Schienen 6.0.3.2

Ich wäre Ihnen dankbar, wenn Sie mir etwas beibringen könnten, wenn Sie eine Idee haben.
Danke für Ihre Kooperation.

Antworten

1 Tatsuro Aug 16 2020 at 07:03

gelöst.

Die Ursache ist

ERB::Util.url_encode("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20")

Wenn die Zeichenfolge, die bei der Codierung in diesem Teil zurückgegeben wurde, unverändert an URI.parse übergeben wurde, wurde URI :: Generic zurückgegeben. Es scheint, dass Uri-Host und Schema beide Null sind und nicht korrekt erworben werden konnten. Da es so wie es ist an Net :: HTTP.get übergeben wird, ist der Fehler wie der Titel aufgetreten.

URI.encodeist veraltet, deshalb wollte ich es mit einer anderen Methode codieren. Als URI.parse für die mit codierte Zeichenfolge ausgeführt wurde, WEBrick::HTTPUtils.#escapewurde schließlich eine Instanz von URI :: HTTP zurückgegeben, und das Schema usw. wurde korrekt festgelegt und gelöst.

Vielen Dank.

Referenz

def search(key_word)
  uri = URI.parse(WEBrick::HTTPUtils.escape("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20"))
  response = Net::HTTP.get_response(uri)
  JSON.parse(response.body)
end