Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTR package POST命令未从REST API返回json_Json_R_Api_Rest - Fatal编程技术网

HTTR package POST命令未从REST API返回json

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-

我在将R连接到应用程序的RESTAPI时遇到问题

我可以使用RCurl包的getURL函数从RESTAPI调用命令,如下所示,它工作得很好

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)
因此,我有点陷入了以下问题:

  • 如何使用RCurl包发送POST请求 或
  • 如何使用HTTR package POST命令从restapi检索正确的JSON结果
  • 我是把标题设置错了,还是做了一些非常愚蠢的事情?任何建议都很好!
    谢谢

    多亏了大卫·罗宾逊在对我最初问题的评论中的帮助,这个问题现在已经解决了

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

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

    RESTResult
    content(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"))