Errno :: EADDRNOTAVAIL saat mengirim permintaan ke api dari Rails di Docker

Aug 15 2020

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_encodemetode.

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

1 Tatsuro Aug 16 2020 at 07:03

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.encodesudah 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