2017-09-06 40 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