Errno :: EADDRNOTAVAIL khi gửi yêu cầu tới api từ Rails trên Docker

Aug 15 2020

Những gì tôi muốn làm

Tôi muốn nhận phản hồi về thông tin sách bằng cách truy cập api google books từ Book model of Rails

Đã xảy ra lỗi

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'

Truy cập API bằng cách sử dụng các từ khóa (tên sách, tác giả, v.v.) được gửi từ biểu mẫu.

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

Vì nó chứa các ký tự không phải ASCII nên nó được mã hóa bằng url_encodephương pháp này.

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

Việc thực thi lệnh curl cho cùng một điểm cuối tất nhiên sẽ đưa ra phản hồi thích hợp.

Có điều gì đó để làm với việc sử dụng docker? Nó dựa trên linux alpine.https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore

Môi trường

  • docker 2.3.0.4
  • docker-soạn 3,8
  • hình ảnh cơ sở rails container ruby: 2.6.6-alpine
  • ruby 2.6.6
  • đường ray 6.0.3.2

Tôi sẽ rất biết ơn nếu bạn có thể chỉ cho tôi nếu bạn có bất kỳ ý tưởng.
Cảm ơn bạn đã hợp tác của bạn.

Trả lời

1 Tatsuro Aug 16 2020 at 07:03

đã giải quyết.

Nguyên nhân là

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

Khi chuỗi ký tự được trả về khi mã hóa trong phần này được chuyển đến URI.parse như cũ, URI :: Generic được trả về. Có vẻ như máy chủ và chương trình uri đều là con số không và không thể được mua một cách chính xác. Vì nó được chuyển đến Net :: HTTP.get như hiện tại, nên đã xảy ra lỗi như tiêu đề.

URI.encodekhông được dùng nữa, vì vậy tôi muốn mã hóa nó bằng một phương pháp khác. Cuối cùng, khi URI.parse được thực hiện trên chuỗi ký tự được mã hóa bằng cách sử dụng WEBrick::HTTPUtils.#escape, một phiên bản của URI :: HTTP đã được trả về và lược đồ, v.v. được đặt chính xác và nó đã được giải quyết.

Cảm ơn rât nhiều.

tài liệu tham khảo

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