我使用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邮件内容的任何想法?
答案 0 :(得分:2)
我自己花了一些时间与这个问题作斗争。问题归结为HTTP规范的差异(这基本上是RCurl所遵循的)以及浏览器实际执行的操作。
事件的顺序如下:
解决方案很简单 - 使用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"
)
然后,您需要查看位置字段的内容,然后自行重定向。
有关基础问题的更多讨论,请参阅: