Help us understand the problem. What is going on with this article?

httrを使ってRからREST APIを叩く

More than 3 years have passed since last update.

意外と記事が無かったので、自分がはまったところを中心に記載しておきます。

なぜ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)
komde
JINS MEME のハードウェアとファームウェアとSDKとアルゴリズムとアプリとクラウドのリフォームをする中の人。Fitness x tech。R/JavaScript、Chromebook使い。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした