ruby - Reddit API 请求中只有 OpenURI 成功
问题描述
我正在向 Reddit API 发出请求。首先,我设置了一个 subreddit 顶部 URL:
reddit_url = URI.parse('https://www.reddit.com/r/pixelart/top.json')
所有这些都正确获取内容:
Net::HTTP.get(reddit_url, 'User-Agent' => 'My agent')
Open3.capture2('/usr/bin/curl', '--user-agent', 'My agent', reddit_url.to_s)[0]
URI.open(reddit_url, 'User-Agent' => 'My agent').read
但后来我尝试使用特定帖子的 URL:
reddit_url = URI.parse('https://reddit.com/r/PixelArt/comments/lkaiqf/another_watercolour_pixelart_tree.json')
和/都失败了,只得到空字符串Net::HTTP
。继续工作,在网络浏览器中打开 URL 也是如此。Open3
curl
URI.open
为什么第二个请求不能与两个解决方案一起使用?以及为什么它适用于URI.open
,当它应该是“<a href="https://ruby-doc.org/stdlib-2.6.3/libdoc/open-uri/rdoc/OpenURI.html" rel="nofollow noreferrer">一个易于使用的 Net::HTTP 包装器”?它有什么不同,以及如何用 复制Net::HTTP
它curl
?
解决方案
使用您的示例,并为简单起见将重点放在 Net::HTTP 上,第一个示例无法按以下方式工作:
require 'net/http'
reddit_url = URI.parse('https://www.reddit.com/r/pixelart/top.json')
Net::HTTP.get(reddit_url, 'User-Agent' => 'My agent')
# => Type Error - no implicit conversion of URI::HTTPS into String
相反,我以此为出发点:
require 'net/http'
reddit_url = URI.parse('https://www.reddit.com/r/pixelart/top.json')
http = Net::HTTP.new(reddit_url.host, reddit_url.port)
http.use_ssl = true
result = http.get(reddit_url.request_uri, 'User-Agent' => 'My agent')
puts result
# => #<Net::HTTPOK:0x00007fc3ea8e7320>
puts result.body.size
# => 167,394
通过该工作,我们可以尝试第二个 URL。有趣的是,根据我是重新使用初始连接还是建立新连接,我会得到不同的结果:
require 'net/http'
reddit_url = URI.parse('https://www.reddit.com/r/pixelart/top.json')
reddit_url_two = URI.parse('https://reddit.com/r/PixelArt/comments/lkaiqf/another_watercolour_pixelart_tree.json')
http = Net::HTTP.new(reddit_url.host, reddit_url.port)
http.use_ssl = true
result = http.get(reddit_url.request_uri, 'User-Agent' => 'My agent')
puts result
# => #<Net::HTTPOK:0x00007f931a143390>
puts result.body.size
# => 174,615
http_two = Net::HTTP.new(reddit_url_two.host, reddit_url_two.port)
http_two.use_ssl = true
result_two = http_two.get(reddit_url_two.request_uri, 'User-Agent' => 'My agent')
puts result_two
# => #<Net::HTTPMovedPermanently:0x00007f931a148818>
puts result_two.body.size
# => 0
result_reusing_connection = http.get(reddit_url_two.request_uri, 'User-Agent' => 'My agent')
puts result_reusing_connection
# => #<Net::HTTPOK:0x00007f931a0fb3b0>
puts result_reusing_connection.body.size
# => 141,575
所以我怀疑你有时会收到 301 重定向,这会造成混乱。关于如何遵循重定向,这里还有另一个问题和答案。
推荐阅读
- algorithm - 在算法复杂的情况下,“#+(n) =”是什么意思?
- flutter - 如果没有互联网连接,则启动画面
- parsing - 如何使用 ansible 从显示版本(cisco ios)解析元数据
- python - Python 脚本在 VSC 中有效,但在手动启动时无效
- r - R中的优化,对优化参数的总和和类型有约束
- python - 在python的for循环中关闭图形
- python - PyCharm 样式的文档字符串,包含带有 `>>>` 的代码
- node.js - 在 typescript 节点项目中使用 monorepo 样式测试目录时,ts-jest 找不到类型信息
- windows - 线程的上下文保存在哪里,是否可以通过编程方式访问(无需修改内核)?
- printing - 带有 Zebra ZM600 的 Ghostscript