2014-08-28 80 views
1

我使用R httr POST函數將jSON主體發送到API。該API正確地返回了302:Found消息,但是httr在我能夠獲取響應體(這是一個帶有一些關鍵位信息的jSON體)之前正在退出函數。抑制302由httr POST返回的錯誤

正在運行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 

我已經運行從終端一樣捲曲後,可以證實什麼,我把從同時與302的API產生的回覆和期望的身體。

僅供參考我的R代碼如下。 (注意:y是jSON格式的主體)

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

想法如何繞過錯誤和捕獲302消息內容?

+0

好奇......會發生什麼,如果你'PUT'代替'POST'?不意味着解決方案 - 僅用於故障排除。 – Deryck 2014-08-28 00:28:50

+0

GUT嘗試一下,它顯示它不是這個特定API的選項。產生「405:方法不允許」錯誤。 – TS4 2014-08-28 01:16:39

回答

1

我只是花了一些時間自己與這個問題作鬥爭。這個問題歸結爲HTTP規範(基本上RCurl堅持的是什麼)和瀏覽器實際做的不同之處。

事件的順序是這樣的:

  1. 發出POST請求到服務器
  2. 服務器處理請求和問題,您重定向到新的URL
  3. RCurl對待這就像新的請求,就像一個POST ,並試圖重播身體。 (瀏覽器不嘗試並重新發送數據)
  4. 它不能重發數據,因爲底層的RCurl不是以這種方式構建的(這就是curl抱怨的原因:「必要的數據倒帶是不可能的「)

解決方法很簡單 - 與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" 
) 

然後您就需要考慮位置字段的內容,並執行重定向自己。

對於潛在的問題的更多討論,請參見:

+0

'config(post = TRUE)'可能會在處理請求時解決問題,但如果沒有可重複的示例,我無法確認 – hadley 2014-08-28 13:28:40

+0

輝煌,問題已解決! – TS4 2014-08-28 13:29:57

+0

@TS4是否使用'post = TRUE'而不是'followlocation = 0L'修復問題? – hadley 2014-08-28 16:49:39