web-dev-qa-db-ja.com

POST RCurlを使用したリクエスト

デンバーRUG用にRでパッケージを作成する方法を探る方法として、datasciencetoolkitAPIの周りにRラッパーを作成するのは楽しい小さなプロジェクトになると思いました。ご想像のとおり、基本的なRツールはRCurlパッケージに含まれています。私は一見単純な問題に悩まされており、このフォーラムの誰かが私を正しい方向に向けることができるかもしれないことを望んでいます。基本的な問題は、postForm()を使用して、キーなしの文字列をcurlのデータオプションの一部として渡すことができないように見えることです。つまり、curl -d "string" "address_to_api"です。

たとえば、コマンドラインから

$ curl -d "Tim O'Reilly, Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people"

成功しました。ただし、postForm()は、追加の引数をPOSTリクエストに渡すときに、明示的なキーを必要とするようです。datasciencetoolkitコードと開発者向けドキュメントで可能なキーを調べましたが、できません。何かを見つけているようです。

余談ですが、GETリクエストを介してDSTKAPIの他の部分に入力を渡すのは非常に簡単です。例えば、

ip2coordinates <- function(ip) {
  api <- "http://www.datasciencetoolkit.org/ip2coordinates/"
  result <- getURL(paste(api, URLencode(ip), sep=""))
  names(result) <- "ip"
  return(result)
}
ip2coordinates('67.169.73.113')

望ましい結果が得られます。

明確にするために、DTLのomegahatサイトのRCurlドキュメント、パッケージを含むRCurlドキュメント、およびcurlのマニュアルページを読みました。ただし、curl(またはpostForm()関数の.opts())に関して基本的なものが不足しているため、取得できないようです。

Pythonでは、基本的に 'raw' POSTリクエストをhttplib.HTTPConnectionを使用して作成できます-Rで利用できるようなものですか?httpRequestパッケージのsimplePostToHost関数も確認しましたRセッションがロックされているように見えました(キーも必要なようです)。

FWIW、Mac10.6.7でR2.13.0を使用しています。

どんな助けでも大歓迎です。データサイエンスツールキットを試してみたい場合は、すべてのコードが間もなくgithubで利用できるようになります。

乾杯。

16
rtelmore

Httrの場合、これは次のとおりです。

library(httr)
r <- POST("http://www.datasciencetoolkit.org/text2people", 
  body = "Tim O'Reilly, Archbishop Huxley")
stop_for_status(r)
content(r, "parsed", "application/json")
21
hadley

一般に、キーが設定されていないものをPOSTしようとしている場合は、その値にダミーキーを割り当てることができます。次に例を示します。

> postForm("http://www.datasciencetoolkit.org/text2people", a="Archbishop Huxley")
[1] "[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":44,\"end_index\":61,\"matched_string\":\"Archbishop Huxley\"},{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":88,\"end_index\":105,\"matched_string\":\"Archbishop Huxley\"}]"
attr(,"Content-Type")
                charset 
"text/html"     "utf-8" 

B = "Archbishop Huxley"などを使用した場合も、同じように機能します。

RCurlをお楽しみください-おそらく私のお気に入りのRパッケージです。冒険心があれば、〜libcurl 7.21にアップグレードすると、curlを介していくつかの新しいメソッド(SMTPなどを含む)が公開されます。

6
Noah

RヘルプリストのDuncanTemple Langから:

postForm()は、curl -dコマンドとは異なるスタイル(または具体的にはContent-Type)のフォーム送信を使用しています。スタイルの切り替え= 'POST'は同じタイプを使用しますが、簡単に推測すると、パラメーター名 'a'が混乱を引き起こし、結果は空のJSON配列-"[]"になります。

簡単な回避策は、postForm()ではなくcurlPerform()を直接使用することです。

r = dynCurlReader()
curlPerform(postfields = 'Archbishop Huxley', url = 'http://www.datasciencetoolkit.org/text2people', verbose = TRUE,
             post = 1L, writefunction = r$update)
r$value()

これにより、

[1]
"[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":0,\"end_index\":17,\"matched_string\":\"Archbishop
Huxley\"}]"

fromJSON()を使用して、Rのデータに変換できます。

2
rtelmore

PostForm関数を介して生の文字列を渡すことに問題があるに違いないことを指摘したかっただけです。たとえば、コマンドラインからcurlを使用すると、次のようになります。

    $ curl -d "Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people
[{"gender":"u","first_name":"","title":"archbishop","surnames":"Huxley","start_index":0,"end_index":17,"matched_string":"Archbishop Huxley"}]

そしてRで私は得る

> api <- "http://www.datasciencetoolkit.org/text2people"
> postForm(api, a="Archbishop Huxley")
[1] "[{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":44,\"end_index\":61,\"matched_string\":\"Archbishop Huxley\"},{\"gender\":\"u\",\"first_name\":\"\",\"title\":\"archbishop\",\"surnames\":\"Huxley\",\"start_index\":88,\"end_index\":105,\"matched_string\":\"Archbishop Huxley\"}]"
attr(,"Content-Type")
                charset 
"text/html"     "utf-8" 

JSON文字列で2つの要素を返し、start_indexとend_indexのどちらにも一致しないことに注意してください。これはエンコーディングなどの問題ですか?

1
rtelmore

Http RequestパッケージのsimplePostTool関数は、ここで探していることを実行する可能性があります。

1
Andy Gayton