Convert curl code into R via the RCurl package?

2020-05-18 04:47发布

问题:

How I would write the following curl POST method using R and the RCurl package?

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?"

回答1:

FINAL EDIT: After emailing the great Duncan Temple Lang I have a solution:

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))

My previous post is below but it has all now been superseded by the edit above (I've left the below for reference):

I would like to know the answer to this question myself. even looking at TARehman's answer I still can't work out how to do it (my lack of understanding is no doubt the root).

If you download curl from its website (I used the generic-win binary version), then here's one way of doing it in R via the 'system' command which is like using the window's command line window but from 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))

The above works with one of the API's I use. You can then use

I really hope you find an answer because it would be useful for me to know too.

EDIT: My attempt using an actual API with RCurl via @TARehman's example:

Here is the curl code which works fine:

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)

And here is how I've rewritten it in 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)

This however did not work and results in the following (clearly I have not understood something correctly):

* 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" 


回答2:

In RCurl, there's a function called postForm(), which is what you'd want to use. My generic example:

library(RCurl)

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

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

Basically, you just pass any parameters you need as named arguments to postForm(), along with the base URL, and it constructs it and posts it, and puts the response into whatever object you declare (webobj) in this case.

If you need to set any curl options, you can use .opts=curlOptions(OPTIONS HERE) to change them.



标签: r api post rcurl