2017-09-06 98 views
0

我試圖在RStudio中使用API​​調用返回JSON響應。它在Postman中返回所需的JSON文件,但httr API調用似乎沒有返回任何我可以解析爲數據框的東西。r調用json數據並轉換爲數據框的API

這是使用HTTR包r中的呼叫:

req <- 
httr::POST("https://api2.elasticgrid.com/api/v1/analytics/vendor/partnerengagement/advanced/all", 
    httr::add_headers(
    "Authorization" = "Bearer <long string>" 
), 
    body = "VendorId=80&TimeFrame=AddMonths(-3)&Language=en-US",encode="json" 
); 

這將返回的10名單,但是沒有什麼用處,我相當肯定的JSON內容不在列表中

隱藏我已經試過:

js <- fromJSON(content(req,as="text")) 

不過,這回 「發生錯誤」

或:

json <- httr::content(req, as = "parsed") 

但這返回非discript鍵 「7B 22 4D ......」

這是郵差工作的API調用(RAW HTTP版本所示):

POST /api/v1/analytics/vendor/collateral/advanced/all HTTP/1.1 
Host: api2.elasticgrid.com 
Authorization: Bearer <long string> 
Content-Type: application/json 
Cache-Control: no-cache 
Postman-Token: <token> 
{ 
"VendorId": 80, 
"TimeFrame": "AddMonths(-3)", 
"Language": "en-US" 
} 

任何人都可以指出我正確的方向來解析一個JSON到基於r API調用的數據框。我已經嘗試了一些軟件包和資源,但我們不確定接下來要做什麼,假設這是可能的。

回答

1

的PBLM可能會從API現身:

req <- 
    httr::POST("https://api2.elasticgrid.com/api/v1/analytics/vendor/partnerengagement/advanced/all", 
      httr::add_headers(
       "Authorization" = "Bearer <long string>" 
      ), 
      body = "VendorId=80&TimeFrame=AddMonths(-3)&Language=en-US",encode="json" 
) 

req$status_code 
[1]500 

狀態這裏的代碼表示服務器沒有響應好。你需要在這裏有一個200,這是成功的代碼。查看維基百科頁面瞭解更多信息:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

您提供的呼叫是否與您正在進行的確切呼叫相符?如果是這種情況,您可能需要再次檢查您的電話。 API可能需要一個訪問令牌來授予訪問權限。

關於您的情況,「7b 22 4d ...」是一個原始字符串。你可以用rawToChar轉換它。

下面是一個在hasIbeenpwned API上調用的簡單工作流程。

#GET the url 
req <- httr::GET("https://haveibeenpwned.com/api/v2/breachedaccount/[email protected]") 
req$status_code 
[1] 200 

# extract req$content 
cont <- req$content 
cont 
[1] 5b 7b 22 54 69 74 6c 65 22 3a 22 30 30 30 77 65 62 68 6f 73 74 22 2c 22 4e 61 6d 65 
[29] 22 3a 22 30 30 30 77 65 62 68 6f 73 74 22 2c 22 44 6f 6d 61 69 6e 22 3a 22 30 30 30 
[57] 77 65 62 68 6f 73 74 2e 63 6f 6d 22 2c 22 42 72 65 61 63 68 44 61 74 65 22 3a 22 32 
[85] 30 31 35 2d 30 33 2d 30 31 22 2c 22 41 64 64 65 64 44 61 74 65 22 3a 22 32 30 31 35 
[113] 2d 31 30 2d 32 36 54 32 33 3a 33 35 3a 34 35 5a 22 2c 22 4d 6f 64 69 66 69 65 64 44 
[141] 61 74 65 22 3a 22 32 30 31 35 2d 31 30 2d 32 36 54 32 33 3a 33 35 3a 34 35 5a 22 2c 

#Convert to char 
char <- rawToChar(req$content) 
char 
[1] "[{\"Title\":\"000webhost\",\"Name\": 
\"000webhost\",\"Domain\":\"000webhost.com\", 
\"BreachDate\":\"2015-03-01\",\"AddedDate\":\"" 
... 

#Convert to df 
df <- jsonlite::fromJSON(char) 
df 
         Title   Name     Domain BreachDate 
1     000webhost  000webhost   000webhost.com 2015-03-01 
2      Adobe   Adobe    adobe.com 2013-10-04 
3    Bitcoin Talk  BitcoinTalk   bitcointalk.org 2015-05-22 
4      BTC-E   BTCE    btc-e.com 2014-10-01 
5     Dailymotion  Dailymotion   dailymotion.com 2016-10-20 
6      Dropbox   Dropbox    dropbox.com 2012-07-01 
... 
+0

感謝您澄清。不幸的是,雖然原始字符串轉化爲消息「發生了錯誤」 – Josh909

+0

我已經編輯了我的文章與關於此的新見解。 –

+0

我同意它確實顯示API正在返回錯誤。我的問題是關於參數翻譯,因爲Postman中的相同查詢有效。 另外,是的持票人令牌已被刪除,所以它不是確切的查詢。 – Josh909