Errno :: EADDRNOTAVAIL quando si invia una richiesta a api da Rails su Docker

Aug 15 2020

Cosa voglio fare

Voglio ottenere la risposta delle informazioni sui libri colpendo l'api di google books da Book model of Rails

L'errore che si è verificato

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'

codice

Premi l'API utilizzando le parole chiave (nome del libro, autore, ecc.) Inviate dal modulo.

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

Poiché contiene caratteri non ASCII, viene codificato utilizzando il url_encodemetodo.

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

L'esecuzione del comando curl per lo stesso endpoint darà ovviamente la risposta corretta.

C'è qualcosa a che fare con l'utilizzo di finestra mobile? È basato su alpine linux.https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore

Ambiente

  • docker 2.3.0.4
  • docker-compose 3.8
  • rails container base image ruby: 2.6.6-alpine
  • rubino 2.6.6
  • binari 6.0.3.2

Ti sarei grato se potessi insegnarmi se hai qualche idea.
Grazie per la collaborazione.

Risposte

1 Tatsuro Aug 16 2020 at 07:03

risolto.

La causa è

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

Quando la stringa di caratteri restituita quando codificata in questa parte è stata passata a URI.parse così com'era, è stato restituito URI :: Generic. Sembra che uri host e schema siano entrambi nulli e non possano essere acquisiti correttamente. Dato che è passato a Net :: HTTP.get così com'è, si è verificato un errore come il titolo.

URI.encodeè deprecato, quindi volevo codificarlo con un altro metodo. Infine, quando URI.parse è stato eseguito sulla stringa di caratteri codificata utilizzando WEBrick::HTTPUtils.#escape, è stata restituita un'istanza di URI :: HTTP e lo schema ecc. È stato impostato correttamente ed è stato risolto.

Grazie mille.

riferimento

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