Skip to content

クライアントヘルパー

xanagi edited this page May 25, 2011 · 5 revisions

アプリケーションが動作している外部サーバから、APIサーバへリクエストを送信して、データを取得・操作することができます。
このときに役に立つのが、クライアントヘルパーです。

クライアントヘルパーを使うと、次の処理を簡単に行うことができます。

  • APIリクエストURLの構築
  • Authorizationヘッダの計算

クライアントヘルパーの取得

クライアントヘルパーは、リクエストのOAuth検証を実行していれば、リクエストオブジェクトから取得することができます。

# People APIでユーザ情報を取得するためのクライアントヘルパー
client_helper = request.client_helper('people', '@me', '@self')

バッチタイプのAPIリクエストを行う場合は、OAuthヘルパーのインスタンスを作成して、クライアントヘルパーを取得します.

# バッチタイプのリクエストを送信するためのクライアントヘルパー
guid = ....
oauth_helper = OpensocialWap::OAuth::Helpers::BasicHelper.new
client_helper = oauth_helper.client_helper('people', guid, '@self')

APIリクエストURL

以下のようにして、APIリクエスト先のURLを取得することができます。

url = client_helper.url # URLを文字列として取得
uri = client_helper.uri # URIオブジェクトとして取得

Authorizationヘッダ

Net::HTTPRequestや、Typhoeus::Requestといったリクエストオブジェクトについて、Authorizationヘッダを計算することができます。

# Net::HTTPRequestを使う場合の例
api_request = Net::HTTP::Get.new(client_helper.uri.request_uri)
authorization_header = client_helper.authorization_header(api_request)
# => "OAuth oauth_consumer_key=...

詳しい使い方については下のサンプルをご覧ください。

サンプル (Net::HTTP を使用)

リクエストタイプ

# GET
client_helper = request.client_helper('people', '@me', '@self')
uri = client_helper.uri
api_request = Net::HTTP::Get.new(uri.request_uri)
api_request['Authorization'] = client_helper.authorization_header(api_request) # Authorizationヘッダを指定
Net::HTTP::start(uri.host) do |http|
  api_response = http.request(api_request)
end

# POST
post_data = '{"class": "Dark Knight"}'
client_helper = request.client_helper('appdata', '@me', '@self', '@app')
uri = client_helper.uri
api_request = Net::HTTP::Post.new(uri.request_uri)
api_request.body = post_data.to_json
api_request['Content-Type'] = 'application/json'
api_request['Authorization'] = client_helper.authorization_header(api_request) # Authorizationヘッダを指定
Net::HTTP::start(uri.host) do |http|
  api_response = http.request(api_request)
end

バッチタイプ

oauth_helper = OpensocialWap::OAuth::Helpers::BasicHelper.new
client_helper = oauth_helper.client_helper('people', guid, '@self')
uri = client_helper.uri
api_request = Net::HTTP::Get.new(uri.request_uri)
api_request['Authorization'] = client_helper.authorization_header(api_request) # Authorizationヘッダを指定
Net::HTTP::start(uri.host) do |http|
  api_response = http.request(api_request)
end

サンプル (Typhoeus を使用)

リクエストタイプ

# GET
client_helper = request.client_helper('people', '@me', '@self')
uri = client_helper.uri
api_request = Typhoeus::Request.new(uri.to_s)
api_request.headers['Authorization'] = client_helper.authorization_header(api_request) # Authorizationヘッダを指定
hydra = Typhoeus::Hydra.new()
hydra.queue(api_request)
hydra.run
api_response = api_request.response

# POST
post_data = '{"class": "Dark Knight"}'
client_helper = request.client_helper('appdata', '@me', '@self', '@app')
uri = client_helper.uri
headers = { 'Content-Type' => 'application/json' }
api_request = Typhoeus::Request.new(uri.to_s, :body => post_data, :method => :post, :headers => headers)
api_request.headers['Authorization'] = client_helper.authorization_header(api_request) # Authorizationヘッダを指定
hydra = Typhoeus::Hydra.new()
hydra.queue(api_request)
hydra.run
api_response = api_request.response

バッチタイプ

oauth_helper = OpensocialWap::OAuth::Helpers::BasicHelper.new
client_helper = oauth_helper.client_helper('people', guid, '@self')
api_request = Typhoeus::Request.new(uri.to_s, :body => post_data, :method => :post, :headers => headers)
api_request.headers['Authorization'] = client_helper.authorization_header(api_request) # Authorizationヘッダを指定
hydra = Typhoeus::Hydra.new()
hydra.queue(api_request)
hydra.run
api_response = api_request.response

トラブルシューティング

問題が発生する場合、以下のポイントをチェックしてください.

  • (リクエストタイプの場合) OAuthの検証は成功しているか.
  • request.opensocial_oauth_verified? でチェックすることができます.
  • リクエストURLは正しいか.
  • client_helper.uri でチェックすることができます.
  • APIへのリクエストの認証でエラーが発生していないか.
  • OpenSocialコンテナがによっては、APIレスポンスの WWW-Authenticate ヘッダを調べることでチェックできる場合があります。