RESTは新しいSOAPです


数年前、私は1つの大規模なテレコム用の新しい情報システムを開発していました。 古いシステムやビジネスパートナーによって開かれているWebサービスの数は増え続けています。 ご存知のように、 SOAP広告のかなりの部分を取得しました。 悪意のあるWSDL、互換性のないライブラリ、奇妙なバグ...可能な限り、単純なRPCプロトコル(XMLRPCまたはJSONRPC)を促進および使用しようとしました。


これらのプロトコルで動作する当社の最初のサーバーとクライアントは非常にシンプルで、適度な機能と信頼性がありませんでした。 しかし、それらを徐々に改善し、数百行のコードを実行した後、目的に到達しました。



これで、わずか数行のコードでこのような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…



Source: https://habr.com/ru/post/J345184/


All Articles