HTTR package POST命令未从REST API返回json
我在将R连接到应用程序的RESTAPI时遇到问题 我可以使用RCurl包的getURL函数从RESTAPI调用命令,如下所示,它工作得很好HTTR package POST命令未从REST API返回json,json,r,api,rest,Json,R,Api,Rest,我在将R连接到应用程序的RESTAPI时遇到问题 我可以使用RCurl包的getURL函数从RESTAPI调用命令,如下所示,它工作得很好 RESTQuery = paste0(MyBaseURL,MyRESTQuery) RESTHeader = c( paste0("Host:",MyServerIP,":",MyServerPort), paste0("Authorization:Basic ",MyEncodedToken), "Connection: keep-
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())
当我尝试使用fromJSON格式化时,如果我尝试以下任一操作,则会出现错误“参数'txt'必须是JSON字符串、URL或文件”:
- fromJSON(RESTResult)
- fromJSON(内容(RESTResult))
- fromJSON(内容(RESTResult)$Cells)
谢谢 多亏了大卫·罗宾逊在对我最初问题的评论中的帮助,这个问题现在已经解决了 要解决此问题并使用fromJSON()函数的格式化结果,请将查询结果解析为文本,然后使用fromJSON函数
RESTResult <- POST(RESTQuery,query=RESTPOSTBody,add_headers(RESTPOSTHeader),verbose())
RESTResultParsed <- fromJSON(content(RESTResult,type="text"))
RESTResultcontent(RESTResult)
的输出是您想要的,但它已经被解析了,我错了吗?也就是说,如果您想在结果中的“轴”上循环,您需要执行for(内容中的轴(RESTResult)$Axes){…
。如果你想得到JSON,你可以做j我觉得有点奇怪的原因是我从getURL查询中得到的结果格式非常好,但也许你是对的,并且已经完成了一些解析!学习如何使用RCurl包来做这件事也很酷,这样我就可以做一个直接比较但无论我尝试什么,我都无法让RCurl包处理我的POST请求。我建议httr而不是RCurl,一般来说,它提供了更多的选项和更强大的界面。但是如果您想获得具有这种格式的文本输出,请尝试content(RESTResult,type=“text”)
。谢谢David,我会尝试一下!我会尝试一下,如果我没有得到什么,我会回来的!我很高兴你解决了你的问题,但除非我弄错了(也许我是!),否则fromJSON(content(RESTResult,type=“text”)
和content(RESTResult)之间没有区别
。这是将列表转换为JSON,然后无缘无故地返回到列表:就像执行sqrt(x^2)
而不仅仅是x
这两个结果是不同的,因为fromJSON函数将结果放入正确的列表中,命名更好,而不是以前的样式输出,因此我更容易处理。无论哪种方式,它现在都工作得很好,谢谢!
> 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.............
RESTResult <- POST(RESTQuery,query=RESTPOSTBody,add_headers(RESTPOSTHeader),verbose())
RESTResultParsed <- fromJSON(content(RESTResult,type="text"))