2016-04-15 1 views
1

Я работаю с Zabbix API, где я думаю, что Content-Type должен быть установлен в application/json-rpc (что бы это ни отличалось от json).Как указать тело в httr POST для содержимого содержимого приложения json-rpc [R]

Я создал 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, используя httr пакет, но это выглядит как традиционная спецификация кузова для 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 для этого запроса на завивание?

+0

Вы можете дать [curlconverter] (https://cran.r-project.org/web/packages/curlconverter/index.html) попытку. Он преобразует операцию командной строки curl в функцию R. – Thomas

+0

Я проверил это и получил ошибку 'Ошибка: буфер обмена на Unix-подобных системах требует« xclip »(рекомендуется) или« xsel ». Поэтому я думаю, что это не связано с моей проблемой: P –

+0

Ответ опубликован здесь http: // stackoverflow.com/a/36697667/3857701 –

ответ

0

Хорошо, это была проблема с не указанным параметром encode = "json" (который был прокомментирован). Не нужно вводить jsonlite::unbox для каждого вектора, но это обязательно для data.frame s, например params.

Смежные вопросы