Errno :: EADDRNOTAVAIL beim Senden einer Anfrage an die API von Rails on Docker
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_encode
Methode 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
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.encode
ist veraltet, deshalb wollte ich es mit einer anderen Methode codieren. Als URI.parse für die mit codierte Zeichenfolge ausgeführt wurde, WEBrick::HTTPUtils.#escape
wurde 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