Преобразовать код curl в R через пакет RCurl?

Как бы я написал следующий метод curl POST с помощью R и пакета RCurl?

curl -k -u myusername:mypassword -d '{"text":"Hello World!","level":"Noob"}' -H "Content-Type: application/json" -H "Accept: application/json" "http://api.website/v1/access?"

2 ответов


окончательное редактирование: после отправки по электронной почте великого Дункана Темпла Ланга у меня есть решение:

library(RCurl)
library(RJSONIO)
postForm("http://api.website/v1/access?",
         .opts = list(postfields = toJSON(list(text = "Hello World!", level = "Noob")),
                      httpheader = c('Content-Type' = 'application/json', Accept = 'application/json'),
                      userpwd = "Username:Password",
                      ssl.verifypeer = FALSE))

мой предыдущий пост, но теперь все это было заменено редактировать выше (я оставил ниже Для справки):

Я хотел бы знать ответ на этот вопрос сам. даже глядя на ответ Таремана, я все еще не могу понять, как это сделать (мое непонимание, без сомнения, является корнем).

если вы загрузите curl с его веб-сайта (я использовал двоичную версию generic-win), затем вот один из способов сделать это в R с помощью команды "system", которая похожа на использование окна командной строки окна, но из R:

output <- system('C:/+/curl-7.27.0-rtmp-ssh2-ssl-sspi-zlib-idn-static-bin-w32/curl  -k -u "username:password" -d "{\"text\":\"Hello World!\",\"level\":\"Noob\"}" -H "Content-Type: application/json" -H "Accept: application/json" "http://api.website/v1/access?"', intern = TRUE))

выше работает с одним из API, которые я использую. Затем вы можете использовать

Я очень надеюсь, что вы найдете ответ, потому что мне тоже было бы полезно знать.

EDIT: моя попытка использовать фактический API с RCurl через @Tarehman's пример:

вот код curl, который отлично работает:

x = system('C:/+/curl-7.27.0-rtmp-ssh2-ssl-sspi-zlib-idn-static-bin-w32/curl  -k -u "USERNAME:PASSWORD" -d "{\"text\":\"Have a nice day!\"}" -H "Content-Type: application/json" -H "Accept: application/json" "http://api.theysay.io:60000/v1/sentiment?"', intern = TRUE)

и вот как я переписал его в RCurl:

curl.opts <- list(userpwd = "username:password", 
                  httpheader = "Content-Type: application/json",
                  httpheader = "Accept: application/json",
                  timeout = 20, 
                  connecttimeout = 20, 
                  verbose = TRUE, 
                  useragent = "RCurl",
                  cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))

postForm("http://api.theysay.io:60000/v1/sentiment?", .params = c(data = '{\"text\":\"Have a nice day!\"}'), .opts = curl.opts)

это, однако, не сработало и приводит к следующему (очевидно, я что-то не понял правильно):

* About to connect() to api.theysay.io port 60000 (#0)
*   Trying 163.1.94.100... * connected
* Connected to api.theysay.io (163.1.94.100) port 60000 (#0)
> POST /v1/sentiment? HTTP/1.1
User-Agent: RCurl
Host: api.theysay.io:60000
Accept: application/json
Content-Length: 193
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------7620b19c7a5d

< HTTP/1.1 100 Continue
< HTTP/1.1 401 Unauthorized
< WWW-Authenticate: Basic realm="Secured Resource"
< Content-Type: text/plain
< Server: spray-can/1.0-M2.1
< Date: Wed, 12 Sep 2012 12:26:06 GMT
< Content-Length: 77
< 
* Ignoring the response-body
* Connection #0 to host api.theysay.io left intact
* Issue another request to this URL: 'http://api.theysay.io:60000/v1/sentiment?'
* Re-using existing connection! (#0) with host api.theysay.io
* Connected to api.theysay.io (163.1.94.100) port 60000 (#0)
* Server auth using Basic with user '[USERNAME]'
> POST /v1/sentiment? HTTP/1.1
Authorization: Basic [KEY]==
User-Agent: RCurl
Host: api.theysay.io:60000
Accept: application/json
Content-Length: 193
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------949d191bdaeb

< HTTP/1.1 100 Continue
< HTTP/1.1 415 Unsupported Media Type
< Content-Type: text/plain
< Server: spray-can/1.0-M2.1
< Date: Wed, 12 Sep 2012 12:26:06 GMT
< Content-Length: 93
< 
* Connection #0 to host api.theysay.io left intact
[1] "There was a problem with the requests Content-Type:\nExpected 'text/xml' or 'application/json'"
attr(,"Content-Type")

"text/plain" 

в RCurl есть функция postForm(), которую вы хотели бы использовать. Мой общий пример:

library(RCurl)

param1 <- "json"
param2 <- "all"
param3 <- "j3kn1kn41" # Hypothetical API token

webobj <- postForm("http://www.thewebsite.com/api/",type=param1,records=param2,token=param3)

в принципе, вы просто передать какие-либо параметры необходимо как именованные аргументы к постформированием(), наряду с базовым URL-адресом, и он создает его и постов, и помещает ответ в любой объект, который вы объявляете (webobj) в этом случае.

Если вам нужно установить любые параметры скручиваемости, вы можете использовать .opts=curlOptions(OPTIONS HERE) изменить их.