如何解决从Docker上的Rails向api发送请求时出现Errno :: EADDRNOTAVAIL
我想做什么
我想通过从Rails的图书模型中点击Google图书api来获得图书信息的响应
发生的错误
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'
代码
使用从表单发送的关键字(书名,作者等)对API进行匹配。
class BooksController <ApplicationController
def search
@results = Book.search(params[:book_search][:search_key_word])
end
end
由于它包含非ASCII字符,因此使用url_encode
方法进行编码。
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
对相同端点执行curl命令当然会给出正确的响应。
使用docker有什么关系吗? 它基于alpine linux。 https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore
环境
- docker 2.3.0.4
- docker-compose 3.8
- rails容器基本图像ruby:2.6.6-alpine
- 红宝石2.6.6
- rails 6.0.3.2
如果您有任何想法可以教我,我将不胜感激。
谢谢您的合作。
解决方法
解决了。
原因是
ERB::Util.url_encode("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20")
将在此部分编码后返回的字符串原样传递给URI.parse时,将返回URI :: Generic。看来uri主机和方案都为零,无法正确获取。 由于它按原样传递给Net :: HTTP.get,因此发生了类似标题的错误。
URI.encode
已过时,因此我想用另一种方法对其进行编码。
最后,当对使用WEBrick::HTTPUtils.#escape
编码的字符串执行URI.parse时,返回了URI :: HTTP的实例,并且正确设置了方案等。
非常感谢您。
参考
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。