Convert curl code into R via the RCurl package?

前端 未结 2 994
不知归路
不知归路 2021-01-31 23:51

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         


        
2条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-02-01 00:01

    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" 
    

提交回复
热议问题