抑制httr POST返回的302错误

时间:2014-08-28 00:26:18

标签: json r curl httr

我使用R httr POST函数将一个jSON主体发送到API。 API正确地返回302:Found消息,但是在我能够获取响应主体(这是一个jSON主体,带有一些关键信息位)之前,httr正在退出该功能。

使用Verbose()参数运行httr,以下是响应:

<- HTTP/1.1 302 Found
<- Cache-Control: no-cache
<- Pragma: no-cache
<- Content-Length: 47
<- Content-Type: application/json; charset=utf-8
<- Expires: -1
Error in function (type, msg, asError = TRUE)  : 
  necessary data rewind wasn't possible

我已经从终端运行了相同的cURL帖子,并且可以确认我发送的内容是否会向302和所需的正文提供API的回复。

作为参考我的R代码如下。 (注意:y是jSON格式的主体)

POST("https://thewebsite",authenticate("myusername","mypassword",type="basic"),
    add_headers("Content-Type" = "application/json"),
    body = y, verbose())

有关如何绕过错误并捕获302邮件内容的任何想法?

1 个答案:

答案 0 :(得分:2)

我自己花了一些时间与这个问题作斗争。问题归结为HTTP规范的差异(这基本上是RCurl所遵循的)以及浏览器实际执行的操作。

事件的顺序如下:

  1. 您向服务器发出POST请求
  2. 服务器处理请求并向您发送重定向到新网址
  3. RCurl将此视为像POST这样的新请求,并尝试重播正文。 (浏览器不要尝试重新发送数据)
  4. 它无法重新发送数据,因为基础RCurl不是以这种方式构建的(这就是卷曲抱怨的原因:&#34;必要的数据倒回不是&#39;可能&#34;)
  5. 解决方案很简单 - 使用config(followlocation = 0L)禁用以下重定向:

    POST("https://thewebsite",
      authenticate("myusername","mypassword"),
      content_type_json(),
      config(followlocation = 0L),
      body = y, 
    )
    
    # PS with httr 0.4 you can simplify to
    POST("https://thewebsite",
      authenticate("myusername","mypassword"),
      config(followlocation = 0L),
      body = x, encode = "json" 
    )
    

    然后,您需要查看位置字段的内容,然后自行重定向。

    有关基础问题的更多讨论,请参阅: