如何调试/显示使用RestClient发送的请求

43

我想使用RestClient通过post方法访问一个web服务。我已经按照规定发送了授权令牌,但仍然收到403状态错误,这意味着我被禁止使用该API。有没有办法可以看到使用http post发送的请求,以便我可以验证标头?我无法找到任何示例或说明文档,介绍如何做到这一点?

我的代码类似于这样:

token = get_token

response = RestClient.post "https://api-dev.xxx.com/software/services/search/ABC",
  :authorization => "Bearer #{token}"
5个回答

71

如果你正在进行更多的REPL类型的开发,那么只需要添加一些内容就可以了。

RestClient.log = 'stdout'

到你的代码中。

你可以在文档中找到其他有效值


14
我看不到POST请求的正文。 - B Seven

30

你可以尝试启用RestClient的日志记录,以查看是否提供了任何有用的输出:

RESTCLIENT_LOG=stdout path/to/my/program

或者如果你在使用Rails

RESTCLIENT_LOG=stdout bundle exec passenger

passenger 替换为您选择的服务器。这将把所有日志重定向到标准输出(您的控制台)。

个人而言,当我需要检查或故障排除HTTP请求时,我更喜欢使用更详细的工具。

如果您喜欢命令行,则可以尝试使用 curlwget,或者许多浏览器扩展程序中的一个,这些扩展程序可以让您轻松执行请求、检查输出、保存供将来使用、设置不同环境等等。两个很好的选择是PostmanAdvanced REST Client


2
只是因为一开始我感到困惑,如果您正在使用 Heroku,那么这也是解决问题的方法。只需使用“heroku config:set RESTCLIENT_LOG=stdout”即可。 - WattsInABox
这里的path/to/my/program是什么?如果我使用我的项目路径,命令会失败并显示“是一个目录...”任何帮助将不胜感激。 - halbano
1
@halbano:这是一个shell语法,仅在给定的命令中定义环境变量。在这里,“path/to/my/program”应该是用于运行您的应用程序的shell命令。 - Richard-Degenne

2
如果您不知道(或者不想麻烦)将环境变量传递到您的应用程序中(在我的情况下是Passenger/Rails),可以执行类似以下操作:
$ cat >/usr/share/foreman/config/initializers/00_rest_client.rb <<'EOT'
require 'rest_client'
RestClient.log =
  Object.new.tap do |proxy|
    def proxy.<<(message)
      Rails.logger.info message
    end
  end
EOT

2
如果你手动编写一个请求,你可以使用 inspect 来显示完整的URL。
req = RestClient::Request.new(
    :method => :post,
    :url => "https://api-dev.xxx.com/software/services/search/ABC",
    headers: {params:{:authorization => "Bearer #{token}"}})

puts req.inspect

2
你可以从异常中获取请求:

def bla(token)
  response = RestClient.post "https://api-dev.xxx.com/software/services/search/ABC", :authorization => "Bearer #{token}"
rescue RestClient::Exception => e
   @logger.error "#{e.response.request.inspect}"
end 

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