Errno :: EADDRNOTAVAIL saat mengirim permintaan ke api dari Rails di Docker
Apa yang ingin saya lakukan
Saya ingin mendapatkan respon informasi buku dengan menekan api google books dari model Book of Rails
Kesalahan yang terjadi
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'
kode
Tekan API menggunakan kata kunci (nama buku, penulis, dll.) Yang dikirim dari formulir.
class BooksController <ApplicationController
def search
@results = Book.search(params[:book_search][:search_key_word])
end
end
Karena mengandung karakter non-ASCII, itu dikodekan menggunakan url_encode
metode.
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
Menjalankan perintah curl untuk titik akhir yang sama tentu saja akan memberikan respon yang tepat.
Apakah ada hubungannya dengan penggunaan buruh pelabuhan? Ini didasarkan pada linux alpine.https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore
Lingkungan Hidup
- buruh pelabuhan 2.3.0.4
- buruh pelabuhan-menulis 3.8
- rel wadah gambar dasar ruby: 2.6.6-alpine
- ruby 2.6.6
- rel 6.0.3.2
Saya akan berterima kasih jika Anda bisa mengajari saya jika Anda punya ide.
Terima kasih atas kerja sama anda.
Jawaban
terpecahkan.
Penyebabnya adalah
ERB::Util.url_encode("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20")
Ketika string karakter dikembalikan saat dienkode di bagian ini diteruskan ke URI.parse apa adanya, URI :: Generic dikembalikan. Tampaknya host dan skema uri sama-sama nihil dan tidak dapat diperoleh dengan benar. Karena diteruskan ke Net :: HTTP.get apa adanya, kesalahan seperti judul terjadi.
URI.encode
sudah usang, jadi saya ingin menyandikannya dengan metode lain. Terakhir, ketika URI.parse dijalankan pada string karakter yang dienkode menggunakan WEBrick::HTTPUtils.#escape
, sebuah instance dari URI :: HTTP dikembalikan, dan skema dll. Disetel dengan benar dan diselesaikan.
Terima kasih banyak.
referensi
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