рд╣рд╛рд▓ рд╣реА рдореЗрдВ Habr├й рдкрд░ рдмрд╣реБрдд рд╡рд┐рд╡рд╛рдж рд╣реБрдЖ рд╣реИ рдХрд┐ рдХреИрд╕реЗ REST API рдХреЛ рдареАрдХ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрдЧреНрд░ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╕реЛрдЪреЗрдВ: рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ REST рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рдЪреЗрдд рд╡рд┐рдХрд▓реНрдк рдпрд╛ рдЖрджрдд рд╣реИ?
рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреА RPC рдЬреИрд╕реА рдПрдкреАрдЖрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ?
рддреЛ
JSON-RPC 2.0 рдХреНрдпрд╛ рд╣реИ?
рдпрд╣ RPC (рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓) рдХреА рд╢реИрд▓реА рдореЗрдВ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕реНрдЯреЗрдЯрд▓реЗрд╕
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ ред
рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИред
рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдПрдХрд▓ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдкреНрд░рдкрддреНрд░ рдХреЗ рдирд┐рдХрд╛рдп рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
{"jsonrpc": "2.0", "method": "post.like", "params": {"post": "12345"}, "id": 1}
:
{"jsonrpc": "2.0", "result": {"likes": 123}, "id": 1}
тАФ :
{"jsonrpc": "2.0", "error": {"code": 666, "message": "Post not found"}, "id": "1"}
!
batch-:
Request:
[
{"jsonrpc":"2.0","method":"server.shutdown","params":{"server":"42"},"id":1},
{"jsonrpc":"2.0","method":"server.remove","params":{"server":"24"},"id":2}
]
Response:
[
{"jsonrpc":"2.0","result":{"status":"down"},"id":1}
{"jsonrpc":"2.0","error":{"code":1234,"message":"Server not found"},"id": 2}
]
id
API , .
┬л┬╗ тАФ ┬лid┬╗, :
{"jsonrpc":"2.0","method":"analytics:trackView","params":{"type": "post", "id":"123"}},
, , .
тАФ . , .
RPC-, npmjs.com, :
client.request('add', [1, 1], function(err, response) {
if (err) throw err;
console.log(response.result); // 2
});
--, HTTP- URI.
, API .
тАФ -, gamedev, realtime-.
тАж
"тЖС" тАФ , , .
post.like(id)
PUT /posts/{id}/likes
?
CQRS, RPC- API .
-, HTTP , -, .
- 200-, - , HTTP-.
JSON-RPC integer тАФ .
JSON-RPC тАФ ,.
: |
---|
REST | RPC |
---|
URI | --- |
GET- | --- |
HTTP- | --- |
| |
: |
---|
REST | RPC |
---|
HTTP- | --- |
HTTP- | --- |
( ) | ( ) |
POST /server/{id}/status
PATCH /server/{id}
?
.
POST /api
.
best practices , .
, .
, REST API . тАж
, Github API, reactions issue?
Accept: application/vnd.github.squirrel-girl-preview
? , . .
HTTP, REST API HTTP.
-.
JSON-RPC over HTTP JSON-RPC over Websocket. TCP.
JSON-RPC , .
- (HTTP).
JSON-RPC , :
тАФ Batch-
тАФ ,
тАФ
, JSON-RPC. тАФ .
HTTP-API HTTP тАФ RPC .
, , read-only API.
- .
API ┬л┬╗ ┬л┬╗ тАФ .
access.logJSON-RPC API - .
.
JSON-RPC
swagger.io.
apidocjs.com, .
, API markdown-.
Stateless┬лREST┬╗тАК тАФ , тАК HTTP тАФ . .
, , HTTP .
, RPC API. ┬лStateless┬╗.
, , - . .
RPC API -, , .
stateless API, ? - statefull тАК тАФ тАКFTP.
: [ TCP-]
: 220 ProFTPD 1.3.1 Server (ProFTPD)
: USER anonymous
: 331 Anonymous login ok, send complete email address as your password
: PASS user@example.com
: 230 Anonymous access granted, restrictions apply
: CWD posts/latest
: 250 CWD command successful
: RETR rest_api.txt
: 150 Opening ASCII mode data connection for rest_api.txt (4321 bytes)
: 226 Transfer complete
: QUIT
: 221 Goodbye.
. FTP- , , , ┬л┬╗ .
API , . .
JSON-RPC 2.0, RPC API HTTP -.
, , , ?
GraphQL, .
gRPC - (), .
REST, . , , .