如何在httr POST中为json rpc应用程序内容类型[R]指定正文

如何在httr POST中为json rpc应用程序内容类型[R]指定正文,json,r,curl,httr,Json,R,Curl,Httr,我认为Content-Type应该设置为application/json-rpc(无论这与json有什么不同) 我创建了一个正常工作的curl请求 curl -H "Content-Type:application/json-rpc" \ -X POST https://zabbix_host/api_jsonrpc.php \ -v \ -A "User

我认为
Content-Type
应该设置为
application/json-rpc
(无论这与json有什么不同)

我创建了一个正常工作的
curl
请求

curl -H "Content-Type:application/json-rpc"             \
     -X POST https://zabbix_host/api_jsonrpc.php \
     -v                                             \
     -A "UserAgentJakis"  \
     -d '{"jsonrpc":"2.0","method":"history.get","params":{"output":"extend","itemids":"100100001196479","history":0,"sortfield":"clock","sortorder":"DESC","limit":10},"auth":"3421b7f82e38323506264018de256bdd","id":1}'
正文(
-d
)是在R中用

toJSON(list(jsonrpc = jsonlite::unbox("2.0"),
                        method = jsonlite::unbox("history.get"),
                        params = jsonlite::unbox(
                            data.frame(output = "extend",
                                                itemids = "100100001196479",
                                                history = 0,
                                                sortfield = "clock",
                                                sortorder = "DESC",
                                                limit = 10)),
                        auth = jsonlite::unbox("3421b7f82e38323506264018de256bdd"),
                        id = jsonlite::unbox(1)))
现在我正试图使用包在R中运行它,但这看起来像是
json
类型的传统主体规范不适用于
json-rpc

> httr::POST(url,
+        content_type('application/json-rpc'),
+        #encode = "json",
+        user_agent("example"),
+        body = 
+        list(jsonrpc = jsonlite::unbox("2.0"),
+               method = jsonlite::unbox("history.get"),
+               params = jsonlite::unbox(
+                   data.frame(output = "extend",
+                                       itemids = "100100001196479",
+                                       history = 0,
+                                       sortfield = "clock",
+                                       sortorder = "DESC",
+                                       limit = 10)),
+                 auth = jsonlite::unbox("3421b7f82e38323506264018de256bdd"),
+                 id = jsonlite::unbox(1)),
+        verbose()
+ ) -> zabbix_response
-> POST /api_jsonrpc.php HTTP/1.1
-> User-Agent: example
-> Host: /i_have_deleted_that/
-> Accept-Encoding: gzip, deflate
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Length: 564
-> Expect: 100-continue
-> Content-Type: application/json-rpc; boundary=------------------------468f366928125e3c
-> 
<- HTTP/1.1 100 Continue
>> --------------------------468f366928125e3c
>> Content-Disposition: form-data; name="jsonrpc"
>> 
>> 2.0
>> --------------------------468f366928125e3c
>> Content-Disposition: form-data; name="method"
>> 
>> history.get
>> --------------------------468f366928125e3c
>> Content-Disposition: form-data; name="params"
>> 
>> 1
>> --------------------------468f366928125e3c
>> Content-Disposition: form-data; name="auth"
>> 
>> 3421b7f82e38323506264018de256bdd
>> --------------------------468f366928125e3c
>> Content-Disposition: form-data; name="id"
>> 
>> 1
>> --------------------------468f366928125e3c--

<- HTTP/1.1 200 OK
<- Server: nginx/1.8.0
<- Date: Fri, 15 Apr 2016 16:00:30 GMT
<- Content-Type: application/json
<- Transfer-Encoding: chunked
<- Connection: close
<- X-Powered-By: PHP/5.5.23
<- Content-Encoding: gzip
<- 
> zabbix_response$request$output
list()
attr(,"class")
[1] "write_memory"   "write_function"
> cat(rawToChar(zabbix_response$content))
{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error","data":"Invalid JSON. An error occurred on the server while parsing the JSON text."},"id":null}
httr::POST(url、, +内容类型(“应用程序/json rpc”), +#encode=“json”, +用户代理(“示例”), +正文= +列表(jsonrpc=jsonlite::unbox(“2.0”), +method=jsonlite::unbox(“history.get”), +params=jsonlite::unbox( +data.frame(output=“extend”, +itemids=“100100001196479”, +历史=0, +sortfield=“时钟”, +sortorder=“DESC”, +限值=10), +auth=jsonlite::unbox(“3421b7f82e38323506264018de256bdd”), +id=jsonlite::unbox(1)), +冗长的 +)->zabbix_响应 ->POST/api_jsonrpc.php HTTP/1.1 ->用户代理:示例 ->主持人:我已经删除了/ ->接受编码:gzip,deflate ->接受:application/json、text/xml、application/xml、*/* ->内容长度:564 ->预期:100人继续 ->内容类型:application/json-rpc;边界=---------------------------468f366928125e3c -> >------------------------------468f366928125e3c >>内容配置:表单数据;name=“jsonrpc” >> >> 2.0 >>------------------------------468f366928125e3c >>内容配置:表单数据;name=“方法” >> >>历史 >>------------------------------468f366928125e3c >>内容配置:表单数据;name=“params” >> >> 1 >>------------------------------468f366928125e3c >>内容配置:表单数据;name=“auth” >> >>3421B7F82E383323506264018 DE256BDD >>------------------------------468f366928125e3c >>内容配置:表单数据;name=“id” >> >> 1 >>------------------------------468f366928125e3c--
好的,这是一个没有指定
encode=“json”
参数的问题(已注释掉)。不必为每个向量键入
jsonlite::unbox
,但这对于
数据是必须的。frame
s如
params

好,这是一个未指定
encode=“json”
参数的问题(已注释掉)。不必为每个向量键入
jsonlite::unbox
,但这对于
data.frame
s(如
params
)是必须的。

您可以试一试。它将curl命令行操作转换为R函数。我检查了这一点,发现了一个错误
错误:类Unix系统上的剪贴板需要“xclip”(推荐)或“xsel”。
因此我认为这与我的问题无关:这里发布了PAnswer,您可以试一试。它将一个curl命令行操作转换为一个R函数。我检查了一下,发现了一个错误
错误:类Unix系统上的剪贴板需要“xclip”(推荐)或“xsel”。
所以我认为这与我的问题无关:PAnswer发布在这里