Errno :: EADDRNOTAVAIL khi gửi yêu cầu tới api từ Rails trên Docker
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'
mã
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_encode
phươ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
đã 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.encode
khô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