RとRCurlパッケージを使用して次のcurlPOSTメソッドを作成するにはどうすればよいですか?
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?"
最終編集:素晴らしいダンカンテンプルラングに電子メールを送った後、私は解決策を持っています:
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))
私の以前の投稿は以下のとおりですが、現在はすべて上記の編集に取って代わられています(参考のために以下を残しました)。
この質問に対する答えを自分で知りたいです。TARehmanの答えを見ても、どうすればいいのかわからない(私の理解不足が根源であることは間違いない)。
そのWebサイトからcurlをダウンロードする場合(私はgeneric-winバイナリバージョンを使用しました)、ウィンドウのコマンドラインウィンドウを使用するのと似ていますが、Rから「system」コマンドを使用してRで実行する1つの方法があります。
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の1つで機能します。その後、使用することができます
私も知っておくと便利なので、答えを見つけていただければ幸いです。
編集:@TARehmanの例を介してRCurlで実際のAPIを使用する私の試み:
正常に機能するカールコードは次のとおりです。
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)
基本的に、必要なパラメータを名前付き引数としてpostForm()にベースURLとともに渡すだけで、それを構築して投稿し、この場合は宣言したオブジェクト(webobj)に応答を入れます。
カールオプションを設定する必要がある場合は、.opts=curlOptions(OPTIONS HERE)
それらを変更するために使用できます。