意外と記事が無かったので、自分がはまったところを中心に記載しておきます。
##なぜhttr?
RからREST APIを叩くにはRCurl / httrのどちらかのパッケージを使うのがメジャーなようです。その中でhttrはOAuth 1.0 と 2.0 を外部パッケージなしで簡単にできそうだったのと、アニュアルのindex見た感じで関数体系が整理されていそうだったので、初めてRESTを叩くならhttrのほうが使いやすそうです、多分(定性的な評価ですみません)。curl使いの人はそのままRCurl使ったほうが良いかもしれません。
httrはRStudioの人がメンテしているみたいですね。Shinyといいhttrといい、RStudioさんには頭が上がりませんm(_ _)m。
##はまったところ
以下2点で1日ぐらい費やしました、、。
###デフォルトで引数として明示的に指定していないヘッダー情報を渡すことがある
この疑いがある時は関数内に "verbose()"をはさんで投げているデータを眺めてみましょう。怪しいデータがあったらリセットをはさみます。
r <- GET(url, query = query, add_headers(Accept = ""), add_headers(Authorization = paste("Bearer",li$access_token),
"Accept-Language" = "ja", Accept = "application/json"), verbose())
###デフォルトではセッション情報が引き継がれるため、いったんログアウトして他のアカウントでログインしても前のアカウント情報が残る
同じアカウントでデータをやり取りし続けるときは気にしなくてもよいですが、いろいろなアカウントのデータを抜く場合は明示的にリセットをしてください。
handle_reset(url)
これはcurlのコマンドラインでは発生しませんが、ブラウザからRESTを叩くツール(DHC)とかでも同じ症状が発生するようですのでご注意ください。
##サンプル
ログイン認証・トークン取得→データ取得→トークン破棄の手順は以下のようになります。大抵のREST APIで以下のコードで再利用できると思います。
library(httr)
p_client_id <- "123456789"
p_client_secret <- "qwertyuiop1234567890asdfghjkl"
ca_url <- "https://api.example.com/ep/login"
rv_url <- "https://api.example.com/ep/revoke"
get_url <- "https://api.example.com/ep/events"
p_id <- "id"
p_pass <- "password"
#ログイン認証
body <- list(grant_type = "password", username=p_id, password = p_pass, client_id = p_client_id, client_secret = p_client_secret)
#verbose()を入れるとこちらが渡した値と返ってきた値の詳細が見えます
r <- POST(ca_url, body = body, encode = "multipart", content_type = "application/x-www-form-urlencoded", verbose())
#トークンなどをリストに格納
li <- content(r, "parsed")
#セッション情報を破棄
handle_reset(ca_url)
#データのGET
#queryにはURLで渡す?以降を切れ目(&)毎にリストにしていきます。
query <- list(type = "type_to_get", fields = "id,created_at,updated_at")
#httrがデフォルトでヘッダーに変な値を入れるので、add_headers(Accept = "")で一旦消す
r <- GET(get_url, query = query, add_headers(Accept = ""), add_headers(Authorization = paste("Bearer",li$access_token),
"Accept-Language" = "ja", Accept = "application/json"))
el <- content(r, "parsed")
handle_reset(get_url)
#トークン破棄
body <- "" #bodyにトークン入れるタイプの場合はセットしたりする
r <- POST(rv_url, body = body, add_headers(Accept = ""), add_headers(Authorization = paste("Bearer",li$access_token),
"Accept-Language" = "ja", Accept = "application/json"), content_type = "application/x-www-form-urlencoded")
rv <- content(r, "parsed")
handle_reset(rv_url)