7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PaymentAdvent Calendar 2015

Day 3

PayPal HATEOAS Linkについて

Last updated at Posted at 2015-12-04

PayPalのAPIには、前から使われいてるClassic APIと2年ぐらい前にリリースされた新しいREST APIがあり、REST APIへの機能の移行が徐々に進んでいますが、REST APIの便利な仕様としてHTEOAS Linkがあります。

HATEAOSの説明(Wikipedia)
https://en.wikipedia.org/wiki/HATEOAS

PayPalのHATEOAS Link
https://developer.paypal.com/docs/api/#hateoas-links

HATEOAS, an abbreviation for Hypermedia as the Engine of Application State

ということですが、簡単に言ってしまうとURL(URI)をつかって、APIのデータを表現する方法です。

よく使われるパターンは、

APIが一度に100件しか返さなくて次の100件を取得したい場合に,
https://xxxx.com/search?name=aaa&page=2
みたいなクエリを投げると思いますが、今までは、この「page=2」のクエリ仕様をDeveloperがドキュメントなどを調べて知っておく必要がありました。
これを初めのレスポンス、
https://xxxx.com/search?name=aaa
内に
{next_link : "https://xxxx.com/search?name=aaa&page=2"}
といったように、「次のページを取得するためのURL」というフィールドとして返すことで、
開発者はそのフィールドの値をGETすれば次のデータを取得することができます。

これにより、情報参照の手間が省けるとともに、仮に「page=2」の部分が「offset=101」に仕様変更になったとしても、プログラムの改修をしなくて済むというメリットがあります。

もうひとつのケースとしては、

従業員データを返すAPIなどで、検索結果には

[{emp_id : "001"}, {emp_id : "002"}, {emp_id : "003"}]

というIDが返ってきて、それを詳細データ参照API

https://xxxx.com/detail?id=001

を使ってデータを参照するというケースがあると思いますが、

[{emp_id : "001", rel : "https://xxxx.com/detail?id=001"}, {emp_id : "002", rel : "https://xxxx.com/detail?id=002"}, {emp_id : "003", rel : "https://xxxx.com/detail?id=003"}]

といった参照用のURIを示すことで、データ参照の実装がやりやすくなります。

単発のAPIコールだけでなくて、幾つかのAPIを複合的にコールすることが多いサービスには有効なアプローチかと思います。

決済は、ユーザーアクションや運用に応じた様々なフロー設計が必要なので、このアプローチにはマッチしていると言えます。

PayPalのHATEOASLinkにおいては、支払い関連のAPIで次にコールすべきAPIのエンドポイントや返された支払いデータの詳細を取得するAPIのエンドポイントを、メソッド(POST/GET)とともに指定しています。
(以下はデベロッパーサイトでの例)

"links": [ { "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U", "rel": "self", "method": "GET" }, { "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U/refund", "rel": "refund", "method": "POST" }, { "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-17S8410768582940NKEE66EQ", "rel": "parent_payment", "method": "GET" } ]

ちなみに、PayPalはこの投稿でも述べたように、APIの標準化にも積極的で、HATEOASで検索すると上記のデベロッパーサイトのページが上位にHITしたり、広く参考にされていたりします。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?