Errno :: Docker üzerinde Rails'den api'ye istek gönderirken EADDRNOTAVAIL

Aug 15 2020

Yapmak istediğim şey

Book model of Rails'den Google Books API'ye basarak kitap bilgilerinin yanıtını almak istiyorum

Meydana gelen hata

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'

kodu

Formdan gönderilen anahtar kelimeleri (kitap adı, yazar, vb.) Kullanarak API'ye basın.

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

ASCII olmayan karakterler içerdiğinden, url_encodeyöntem kullanılarak kodlanmıştır .

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

Aynı son nokta için curl komutunu yürütmek elbette doğru yanıtı verecektir.

Docker kullanmanın bir ilgisi var mı? Alpin linux'a dayanmaktadır.https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore

Çevre

  • docker 2.3.0.4
  • docker-compose 3.8
  • raylar konteyner temel görüntüsü yakut: 2.6.6-alp
  • yakut 2.6.6
  • raylar 6.0.3.2

Herhangi bir fikriniz varsa bana öğretebilirseniz minnettar olurum.
İşbirliğiniz için teşekkürler.

Yanıtlar

1 Tatsuro Aug 16 2020 at 07:03

çözüldü.

Nedeni

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

Bu kısımda kodlandığında döndürülen karakter dizisi URI.parse'ye olduğu gibi geçirildiğinde, URI :: Generic döndürüldü. Görünüşe göre uri ana bilgisayarı ve şeması hem sıfır hem de doğru bir şekilde alınamadı. Net :: HTTP.get'e olduğu gibi aktarıldığı için başlık gibi hata oluştu.

URI.encodekullanımdan kaldırıldı, bu yüzden onu başka bir yöntemle kodlamak istedim. Son olarak, kullanılarak kodlanan karakter dizisi üzerinde URI.parse yapıldığında WEBrick::HTTPUtils.#escape, bir URI :: HTTP örneği döndürüldü ve şema vb. Doğru şekilde ayarlandı ve çözüldü.

Çok teşekkür ederim.

referans

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