Errno :: EADDRNOTAVAIL lors de l'envoi d'une requête à l'API depuis Rails on Docker

Aug 15 2020

Ce que je veux faire

Je veux obtenir la réponse des informations sur le livre en accédant à l'API google books de Book model of Rails

L'erreur qui s'est produite

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

Accédez à l'API en utilisant les mots-clés (nom du livre, auteur, etc.) envoyés depuis le formulaire.

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

Puisqu'il contient des caractères non ASCII, il est codé à l'aide de la url_encodeméthode.

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'exécution de la commande curl pour le même point de terminaison donnera bien sûr la réponse appropriée.

Y a-t-il quelque chose à voir avec l'utilisation de docker? Il est basé sur linux alpin.https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore

Environnement

  • docker 2.3.0.4
  • docker-compose 3.8
  • rails conteneur image de base rubis: 2.6.6-alpine
  • rubis 2.6.6
  • rails 6.0.3.2

Je vous serais reconnaissant si vous pouviez m'apprendre si vous avez une idée.
Merci de votre collaboration.

Réponses

1 Tatsuro Aug 16 2020 at 07:03

résolu.

La cause est

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

Lorsque la chaîne de caractères renvoyée lorsqu'elle était encodée dans cette partie était transmise à URI.parse telle quelle, URI :: Generic était renvoyé. Il semble que l'hôte et le schéma d'URI sont tous deux nuls et n'ont pas pu être acquis correctement. Puisqu'il est passé à Net :: HTTP.get tel quel, l'erreur comme le titre s'est produite.

URI.encodeest obsolète, j'ai donc voulu l'encoder avec une autre méthode. Enfin, lorsque URI.parse a été exécuté sur la chaîne de caractères encodée en utilisant WEBrick::HTTPUtils.#escape, une instance de URI :: HTTP a été renvoyée, et le schéma etc. a été défini correctement et il a été résolu.

Merci beaucoup.

référence

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