首页 文章

HTTR包POST命令不从REST API返回json

提问于
浏览
0

我在将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 回答

  • 0

    由于David Robinson在对我原始问题的评论中的帮助,现在已经解决了这个问题 .

    要解决此问题,并使用 fromJSON() 函数的格式化结果,请将查询结果解析为文本,然后使用fromJSON函数 .

    RESTResult <- POST(RESTQuery,query=RESTPOSTBody,add_headers(RESTPOSTHeader),verbose())
    RESTResultParsed <- fromJSON(content(RESTResult,type="text"))
    

    结果是一个非常好的列表,然后您可以使用标准函数进行操作 .

相关问题