数年前、私は1つの大規模なテレコム用の新しい情報システムを開発していました。 古いシステムやビジネスパートナーによって開かれているWebサービスの数は増え続けています。 ご存知のように、 SOAP広告のかなりの部分を取得しました。 悪意のあるWSDL、互換性のないライブラリ、奇妙なバグ...可能な限り、単純なRPCプロトコル(XMLRPCまたはJSONRPC)を促進および使用しようとしました。
これらのプロトコルで動作する当社の最初のサーバーとクライアントは非常にシンプルで、適度な機能と信頼性がありませんでした。 しかし、それらを徐々に改善し、数百行のコードを実行した後、目的に到達しました。
- さまざまな方言のサポート(Apache用に作成されたXMLRPC拡張など)
- Python例外と階層エラーコード間の組み込み変換、
- 機能的エラーと技術的エラーの別々の処理、
- 技術的なエラーの場合の自動再試行、
- リクエストの前後に関連するログと統計の収集、
- 入力データの徹底的な検証...
これで、わずか数行のコードでこのようなAPIに確実に接続できました。 また、いくつかのデコレータとドキュメントの更新の助けを借りて、サーバーとブラウザ用の幅広い機能セットを開くことができるようになりました。
また、(マイクロサービスに基づいて構築された)異なるアプリケーション間の相互作用については、システム管理者によってすでに行われています。 ソフトウェアの部分には実際にはあいまいさはありませんでした。
RPC APIの30分という難しい統合の後に休む開発者
そして、RESTが登場しました。
REpresentational State Transfer-プレゼンテーション状態の転送。
この新しい波は、サービス間コラボレーションの基本を揺るがしました。
RPCは死に、未来はRESTfulでした。リソースは独自のURLに存在し、HTTPプロトコルを使用してのみ操作できます。
それ以来、私たちが公開しなければならなかった、またはアクセスしたすべてのAPIは、言うまでもなく、狂気という新たな困難に変わりました。
そして、RESTの問題は何ですか?
指で説明しないために、例を挙げて説明します。 読みやすくするためにデータ型を削除した小さなAPIを次に示します。
createAccount(username, contact_email, password) -> account_id
addSubscription(account_id, subscription_type) -> subscription_id
sendActivationReminderEmail(account_id) -> null
cancelSubscription(subscription_id, reason, immediate=True) -> null
getAccountDetails(account_id) -> {full data tree}
(InvalidParameterError
, MissingParameterError
, WorkflowError
…) ( , AlreadyExistingUsernameError
), .
API , , . (state machine), ( ).
API RPC-: .
, RESTful.
, . « REST», .
CRUD-? must_send_activation_reminder_email? activation_reminder_email resource? DELETE cancelSubscription()
, grace- ? getAccountDetails()
, REST?
URL-endpoint «»? , , .
HTTP-?
, ?
HTTP-, URL, , , ?
. , , . , , , .
, REST ?
, ( : rest «»).
, .
REST-
REST CRUD, , . , HTTP- (POST), (GET), (PUT/PATCH) (DELETE) .
, HTTP- . , . , : « , ». , , . .
, . , PUT, PATCH DELETE ? . GET POST . POST , HTTP-. , — .
PUT ? , , « » (complete resource), . . , GET. , GET ( , , …)? PUT? « HTTP 409», ( GET…)? , ( )? , , REST , , . GET , ( ), POST/PUT — .
PATCH? , , 99 % , , , , ( ). (, PayPal), RESTful- . : PATCH . « », . , . -- — - REST.
DELETE? , , PDF- . DELETE . REST- , - . DELETE- base64- ?
REST , « » API « RESTful». , PUT URL (/myresourcebase/myresourceid), « » — POST URL (/myresourcebase) HTTP- «» URL ( HTTP-). : . — Big Endian Little Endian, , « » .
… URL’ . , urlencode()
REST URL’? - . SSRF/CSRF-.
urlencode 30 URL’
REST-
«» . — , .
HTTP . , .
HTTP 404 Not Found — -RESTful, ? : nginx , API 404 , , …
,
, HTTP 401 Unauthorized, ? Ajax- Safari , ( ).
HTTP REST, . — : .
HTTP Webdav, Microsoft, , . , REST, , , HTTP- HTTP 418 I’m a teapot . HTTP 400 Bad Request , , , , , . : , , . API .
REST
REST , , , REST . :
REST — - . .
.
REST .
, , , .
REST — , . , .
, . .
REST , (stateless).
, - - , . , , … . , , HTTP, RPC.
REST HTTP-!
: GET- -. , (Memcached . .) 99 % -? — . API , - Varnish ? , «» ? . , HTTP-, GET , REST .
REST !
? API : API, ; API, . REST . «», , N + 1 . (, , …) — N + 1 HTTP-. , ID . , , .
REST .
? REST - URL’ “/v2/” “/v3/”? C API, , / . , REST .
REST , HTTP!
, , . XML — , HTTP — . ( «» XML), . RPC, .
REST , CURL!
CURL HTTP. SOAP. GET-, JSON- XML- POST-. , , API-, .
, .
. , , HATEOAS; ( ) «». , , — . API, , : . : PUT URL’, , , .
, HATEOAS
REST ?
«». REST — , « ».
: - RESTful- , ?
?
- URL- . API REST- , , .
Django-Rest-Framework REST API, SQL/noSQL-. «CRUD HTTP», . API , , REST- , .
HTTP- , . , .
?
, .
API N .
URL’, , , API. .
, - ?
.
. . . . . .
. PHP, Ruby, Python, .NET, iOS, Android, Java… Go NodeJS.
Github-. , pull-. . , - ActiveRecord RPC-.
. , , -.
API
: , , . . .
REST : , HTTP-, .
— — ? , .
, - , REST . REST, CRUD-. REST-, , , .
. . , RPC , . .
RPC 99 % , , , . , — HTTP, — .
REST , .
REST , .
REST , .
REST — SOAP.
. , , , HTTP2… . -.
, . XMLRPC JSONRPC, Pyro RMI , GraphQL gRPC API…