如何检查HTTParty生成的完整URL?

21

我想查看HTTParty gem从我的参数构建的完整URL,无论是提交前还是提交后都可以。

我也很乐意从响应对象中获取这个URL,但我看不到任何方法可以实现。

(一些背景信息)

我正在使用HTTParty gem构建一个API包装器。它基本上可以工作,但有时我会从远程站点收到意外的响应,我想深入了解原因——我发送的内容是否有错误?如果有,是什么错误?我是否以某种方式使请求格式不正确?查看原始URL有助于故障排除,但我不知道如何做到。

例如:

HTTParty.get('http://example.com/resource', query: { foo: 'bar' })

可能会生成:

http://example.com/resource?foo=bar

但是我该如何检查呢?

在一个例子中,我做了这个:

HTTParty.get('http://example.com/resource', query: { id_numbers: [1, 2, 3] }

但它没有起作用。通过实验,我能够制作出这个可行的方案:

HTTParty.get('http://example.com/resource', query: { id_numbers: [1, 2, 3].join(',') }

很明显,HTTParty默认的查询字符串形成方法与API设计者首选的格式不符。这没关系,但确切地弄清楚需要什么是很困难的。

3个回答

32

你的示例中没有传递基本URI,因此它无法工作。

更正后,您可以像这样获取整个URL:

res = HTTParty.get('http://example.com/resource', query: { foo: 'bar' })
res.request.last_uri.to_s
# => "http://example.com/resource?foo=bar" 

使用类:

class Example
  include HTTParty
  base_uri 'example.com'

  def resource
    self.class.get("/resource", query: { foo: 'bar' })
  end
end

example = Example.new
res = example.resource
res.request.last_uri.to_s
# => "http://example.com/resource?foo=bar" 

是的,这实际上是从一个子类复制过来的,所以 base_uri 已经被设置了。我会进行更正。谢谢! - Leo
啊,我明白了!我尝试了res.last_uri但是出错了。现在我明白了,包括.response可以得到正确的对象。 - Leo
1
工作正常但不会显示传递给URL的参数。 - djangofan

12

您可以通过首先设置以下内容来查看HTTParty发送的请求的所有信息:

class Example
  include HTTParty
  debug_output STDOUT
end

然后它将请求信息,包括URL,打印到控制台上。


这真的很有用。我将接受@victorkohl提供的答案,因为它更直接适用,但作为一般调试方法,这非常好。 - Leo
我遇到了一个 NoMethodError: undefined method 'debug_output' for HTTParty:Module 错误。 - infused
https://ruby-doc.org/stdlib-2.3.1/libdoc/net/http/rdoc/Net/HTTP.html#method-i-set_debug_output 这个怎么样? - hatenine

0
此处 所解释的那样,如果您需要在发出请求之前获取URL,则可以执行以下操作。
HTTParty::Request.new(:get, '/my-resources/1', query: { thing: 3 }).uri.to_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接