我在将R连接到应用程序的REST API时遇到问题 .
我可以使用RCurl包的getURL函数从REST API调用命令,如下所示,它可以很好地工作 .
RESTQuery = paste0(MyBaseURL,MyRESTQuery)
RESTHeader = c(
paste0("Host:",MyServerIP,":",MyServerPort),
paste0("Authorization:Basic ",MyEncodedToken),
"Connection: keep-alive"
)
RESTResult = getURL(URL=RESTQuery,httpheader=RESTHeader,verbose=true)
然后可以使用fromJSON(RESTResult)解析此RESTResult并且它工作得很好 .
但是,我找不到发送包含头的POST RCurl请求的等效方法,所以我移动到httr包发送POST请求 . 以下代码有效,但fromJSON函数返回错误:
RESTQuery = paste0(MyBaseURL,MyRESTQuery)
RESTPOSTHeader = c(
'Content-Type'="application/json; charset=utf-8",
'Authorization'=paste0("Basic ",MyEncodedToken),
'Accept'="application/json"
)
RESTPOSTBody = c(
"$expand=Axes,Cells"
)
RESTResult <- POST(RESTQuery,query=RESTPOSTBody,add_headers(RESTPOSTHeader),verbose())
返回的值是从REST API正确返回的,但它们似乎没有格式化为JSON,因此我无法将它们解析为一个漂亮的数据帧 . 以下是以详细模式查询的返回代码:
-> User-Agent: curl/7.39.0 Rcurl/1.95.4.5 httr/0.6.1
-> Host: <My server>:<My Port>
-> Accept-Encoding: gzip
-> Cookie: SessionId=NMD-MavwPL_QhdHFMRyhZQ
-> Content-Type: application/json; charset=utf-8
-> Authorization: Basic <My Encoded Token>
-> Accept: application/json
-> Content-Length: 0
->
<- HTTP/1.1 201 Created
<- Content-Length: 944
<- Connection: keep-alive
<- Content-Encoding: gzip
<- Cache: no-cache
<- Content-Type: application/json;odata.metadata=minimal;odata.streaming=true; charset=utf-8
<- Location: ../../Cellsets('sIYzNM4HAIAGAAAg')
<- OData-Version: 4.0
<- Set-Cookie: SessionId=7V5XAXXjwfbaXmdOb3FgJQ; Path=/api/; HttpOnly
我使用内容时的值(RESTResult):
> content(RESTResult)
$`@odata.context`
[1] "../../$metadata#Cellsets(Axes(Hierarchies+(Name),Tuples+(Members(Name))),Cells)/$entity"
$ID
[1] "sIYzNM4HAIAGAAAg"
$Axes
$Axes[[1]]
$Axes[[1]]$Ordinal
[1] 0
$Axes[[1]]$Cardinality
[1] 3
$Axes[[1]]$Hierarchies
$Axes[[1]]$Hierarchies[[1]]
$Axes[[1]]$Hierarchies[[1]]$Name
[1] "Period_General"
$Axes[[1]]$Tuples
$Axes[[1]]$Tuples[[1]]
$Axes[[1]]$Tuples[[1]]$Ordinal
[1] 0
$Axes[[1]]$Tuples[[1]]$Members
$Axes[[1]]$Tuples[[1]]$Members[[1]]
$Axes[[1]]$Tuples[[1]]$Members[[1]]$Name
[1] "all periods"
$Cells
etc.............
当我尝试使用fromJSON格式化时,我得到错误“Argument'txt'必须是JSON字符串,URL或文件”如果我尝试以下任何一种方法:
-
fromJSON(RESTResult)
-
fromJSON(content(RESTResult))
-
fromJSON(content(RESTResult)$ Cells)
所以,我有点卡在以下方面:
-
如何使用RCurl包发送POST请求或
-
如何使用HTTR包POST命令从REST API中检索正确的JSON结果?
我设置 Headers 是错误的,还是做了一些非常愚蠢的事情?任何建议都会很棒!谢谢!!
1 回答
由于David Robinson在对我原始问题的评论中的帮助,现在已经解决了这个问题 .
要解决此问题,并使用 fromJSON() 函数的格式化结果,请将查询结果解析为文本,然后使用fromJSON函数 .
结果是一个非常好的列表,然后您可以使用标准函数进行操作 .