当其他 REST 客户端成功时,HTTParty 会得到 403



我正在尝试使用帖子和HTTParty创建资源。终结点要求用户名和密码作为标头包含在内。使用 chrome 的 rest 客户端扩展,帖子通过良好,但是当我尝试使用 HTTParty 做同样的事情时,我得到了 403 禁止。我已经详细比较了生成的请求,它们似乎是相同的。

我的HTTParty帖子:

response = HTTParty.post(OpenIdm.end_point + extension_create,
        headers: {'X-OpenIDM-Username' => "<USERNAME>", 'X-OpenIDM-Password' => "<PASSWORD>"},  
        body: payload_hash.to_json 
    )

这是一个相当简单的发布请求,我已经直接用Ruby的Net::HTTP类以及另一个gem,RestClient尝试过。在所有情况下,我都会得到 403,而其他发布方法(不使用红宝石的方法(运行良好。这怎么能在其他地方正常工作,但在 Ruby 中却不起作用?

更新:

这是帖子的调试输出:

opening connection to <HOST>...
opened
<- "POST /openidm/managed/user/234acbef-c501-4dbb-9501-b1dd45411928 HTTP/1.1rnX-Openidm-Username: <USERNAME>rnX-Openidm-Password: <PASSWORD>rnConnection: closernHost: <HOST>.com:8080rnrn"
-> "HTTP/1.1 403 Forbiddenrn"
-> "Set-Cookie: JSESSIONID=1mfz68wywh1jg1l3m04dprt0eu;Path=/rn"
-> "Expires: Thu, 01 Jan 1970 00:00:00 GMTrn"
-> "Content-Type: application/json; charset=UTF-8rn"
-> "Date: Fri, 11 Oct 2013 13:02:47 GMTrn"
-> "Accept-Ranges: bytesrn"
-> "Server: Restlet-Framework/2.0.15rn"
-> "Connection: closern"
-> "rn"
reading all...
-> "{"error":403,"reason":"Forbidden","message":"Access denied"}"
read 60 bytes
Conn close
{"error"=>403, "reason"=>"Forbidden", "message"=>"Access denied"}

这似乎是Net::HTTP如何处理标头的问题。我已经尝试了路边宝石,一切正常。唯一的缺点是对 curl 的依赖性增加。对于那些好奇的人,这是解决方法:

http = Curl.post("<HOST>/openidm/managed/user/e9d105c0-14a5-0131-0eab-10ddb19e6b69", json 
    do |http|
        http.headers['X-OpenIDM-Username'] = '<USERNAME>'
        http.headers['X-OpenIDM-Password'] = '<PASSWORD>'
    end

最新更新