Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
9
Help us understand the problem. What is going on with this article?
@komde

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)
9
Help us understand the problem. What is going on with this article?
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
komde
JINS MEME のハードウェアとファームウェアとSDKとアルゴリズムとアプリとクラウドのリフォームをする中の人。Fitness x tech。R/JavaScript、Chromebook使い。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
9
Help us understand the problem. What is going on with this article?