ЁЯУи рдзрдбрд╛ 02 тАФ HTTP рдЪреА рд░рдЪрдирд╛: рдЪрд┐рдареНрдареА рдЖрдгрд┐ рд╢рд┐рдХреНрдХрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-apis ┬╖ рдкреБрдвреЗ: lesson-03-rest-resources
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд request рдЖрдгрд┐ response рдЪреА рдиреЗрдордХреА рд░рдЪрдирд╛ тАФ рдкреНрд░рддреНрдпреЗрдХ slip рд╡рд░рдЪреНрдпрд╛ рдкрд╛рдЪ рдЧреЛрд╖реНрдЯреА рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рдХреНрдХрд╛ рдорд╛рд░рд▓реЗрд▓реНрдпрд╛ рдЙрддреНрддрд░рд╛рд╡рд░рдЪреНрдпрд╛ рддреАрди рдЧреЛрд╖реНрдЯреА.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Counter рд╡рд░рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ slip рд╡рд░ рддреЗрдЪ рд░рдХрд╛рдиреЗ рдЕрд╕рддрд╛рдд, рдиреЗрд╣рдореА рддреНрдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ:
- рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ тАФ method:
GET(рд╡рд╛рдЪрд╛),POST(рдЬреЛрдбрд╛),PUT(рдкреВрд░реНрдг рдмрджрд▓рд╛),DELETE(рдХрд╛рдврд╛). - рдХрд╢рд╛рдмрджреНрджрд▓ тАФ path:
/v1/students/2. - рд╕рдорд╛рд╕рд╛рддрд▓реНрдпрд╛ рдЬрд╛рджрд╛ рдиреЛрдВрджреА тАФ headers: "рдорд▓рд╛ JSON рд╕рдордЬрддреЗ"
(
Accept), "рд╣рд╛ рдорд╛рдЭрд╛ pass" (X-API-Key), "рдмрджрд▓рд▓реЗ рдЕрд╕реЗрд▓ рддрд░рдЪ" (If-None-Match). - рдкреНрд░рддреНрдпрдХреНрд╖ form тАФ body: рдлрдХреНрдд рддреБрдореНрд╣реА рдХрд╛рд╣реА рдЬреЛрдбрдд рдХрд┐рдВрд╡рд╛
рдмрджрд▓рдд рдЕрд╕рд╛рд▓ рддреЗрд╡реНрд╣рд╛ (
{"name": "Zoya", "class": "3B"}). - рд╢реЗрд╡рдЯреА рдПрдХ query тАФ
?limit=2&class=3A: filters рдЖрдгрд┐ рдкрд░реНрдпрд╛рдп.
Clerk рдЪреНрдпрд╛ рдЙрддреНрддрд░рд╛рдЪреЗ рддреАрди рднрд╛рдЧ рдЕрд╕рддрд╛рдд: рд╢рд┐рдХреНрдХрд╛ (status code), рдХрд╛рд╣реА
рд╕рдорд╛рд╕рд╛рддрд▓реНрдпрд╛ рдиреЛрдВрджреА (ETag, Content-Type, Location рд╕рд╛рд░рдЦреЗ headers), рдЖрдгрд┐
рдордЬрдХреВрд░ (body, рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ JSON). рд╢рд┐рдХреНрдХреЗ рдХреБрдЯреБрдВрдмрд╛рдВрдд рдпреЗрддрд╛рдд:
- 2xx тАФ рдЭрд╛рд▓реЗ.
200 OK,201 Created(рддреЗ рдЗрдереЗ рд░рд╛рд╣рддреЗ:Location),204 No Content(рдЭрд╛рд▓реЗ, рд╕рд╛рдВрдЧрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реА рдирд╛рд╣реА). - 3xx тАФ рддреНрдпрд╛рдРрд╡рдЬреА рддрд┐рдХрдбреЗ рдЬрд╛.
304 Not Modified(рддреБрдордЪреА рдкреНрд░рдд рдЕрдЬреВрди рдЪрд╛рдВрдЧрд▓реА рдЖрд╣реЗ). - 4xx тАФ рддреБрдордЪреА slip рдЪреБрдХреАрдЪреА рдЖрд╣реЗ.
400рдЪреБрдХреАрдЪрд╛ form,401pass рдирд╛рд╣реА,403рдЪреБрдХреАрдЪрд╛ pass,404рдЕрд╕реЗ рдХрд╛рд╣реА рдирд╛рд╣реА,409рд╕рдВрдШрд░реНрд╖ (conflict),415рдЪреБрдХреАрдЪрд╛ рдХрд╛рдЧрдж,429рдЦреВрдк рдЬрд╛рд╕реНрдд slips. - 5xx тАФ рдЖрдордЪреЗ office рдмрд┐рдШрдбрд▓реЗ рдЖрд╣реЗ.
500,502,503,504тАФ рддреБрдордЪреА рдЪреВрдХ рдирд╛рд╣реА; рдирдВрддрд░ рдкреБрдиреНрд╣рд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛.
ЁЯЧ║я╕П рдЖрдХреГрддреА
sequenceDiagram
participant C as ЁЯзС client
participant S as ЁЯПв school-api
C->>S: 1 GET /v1/students/2 (Accept: application/json)
S-->>C: 2 200 OK ┬╖ ETag "0e9aтАж" ┬╖ Cache-Control ┬╖ {"id":2,"name":"Katrina",тАж}
C->>S: 3 GET /v1/students/99
S-->>C: 4 404 Not Found ┬╖ {"error":{"code":"not_found","message":"No student with id 99."}}
Note over C,S: 2xx done ┬╖ 3xx elsewhere ┬╖ 4xx your slip ┬╖ 5xx our office
тЭУ рдХрд╛рдп
- Request рдореНрд╣рдгрдЬреЗ text: рдПрдХ request line (
GET /v1/students/2 HTTP/1.1), headers (рдкреНрд░рддреНрдпреЗрдХ рдУрд│реАрдд рдПрдХ), рдПрдХ рд░рд┐рдХрд╛рдореА рдУрд│, рдордЧ body.curl -vрддреБрдореНрд╣рд╛рд▓рд╛ рдиреЗрдордХреЗ рд╣реЗрдЪ рджрд╛рдЦрд╡рддреЛ. - Response рд╕реБрджреНрдзрд╛ text рдЖрд╣реЗ: рдПрдХ status line (
HTTP/1.0 200 OK), headers, рд░рд┐рдХрд╛рдореА рдУрд│, body.curl -ibody рд╕реЛрдмрдд headers рдЫрд╛рдкрддреЛ. - Headers рдореНрд╣рдгрдЬреЗ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВ рд╡рд╛рдЯрд╛рдШрд╛рдЯреАрд╕рд╛рдареА рд╡рд╛рдкрд░рддрд╛рдд рддреНрдпрд╛ рд╕рдорд╛рд╕рд╛рддрд▓реНрдпрд╛ рдиреЛрдВрджреА: format
(
Content-Type,Accept), рдУрд│рдЦ (Authorization,X-API-Key), caching (ETag,Cache-Control), tracing (X-Request-Id). Content-Type: application/jsonрд╣реЗ body рдмрджреНрджрд▓рдЪреЗ рд╡рдЪрди рдЖрд╣реЗ. рдЖрдордЪреЗ API JSON рдирд╕рд▓реЗрд▓реА body415рдиреЗ рдирд╛рдХрд╛рд░рддреЗ тАФ рдкрд╛рд╣рд╛ school_api.py рдордзрд▓реЗread_json().- Status codes рдореНрд╣рдгрдЬреЗ рд╢рдмреНрджрд╕рдВрдЧреНрд░рд╣ рдЖрд╣реЗ, рд╕рдЬрд╛рд╡рдЯ рдирд╛рд╣реА: clients рддреНрдпрд╛рдиреБрд╕рд╛рд░ рдирд┐рд░реНрдгрдп рдШреЗрддрд╛рдд (503 retry рдХрд░рд╛, 400 рдХрдзреАрдЪ retry рдХрд░реВ рдирдХрд╛ тАФ рдзрдбрд╛ 07).
ЁЯФз рд╕рд╛рддрд╣реА рд╢рд┐рдХреНрдХреЗ, рдЪрд┐рддреНрд░рд╛рдд: GET, HEAD, OPTIONS, POST, PUT, PATCH рдЖрдгрд┐ DELETE тАФ safe, idempotent, cacheable, рдкреНрд░рддреНрдпреЗрдХ рджреЗрдд рдЕрд╕рд▓реЗрд▓реЗ status codes, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдпрд╛ counter рд╡рд░ рд╕рд┐рджреНрдз рдХрд░рдгрд╛рд░реА script тАФ рд╣реЗ рд╕рдЧрд│реЗ рдзрдбрд╛ 13 тАФ рдкреНрд░рддреНрдпреЗрдХ REST method рдордзреНрдпреЗ рдЖрд╣реЗ.
bash api/methods_demo.shрддреЗ рдЪрд╛рд▓рд╡рддреЗ (HEAD рдЖрдгрд┐ OPTIONS рд╕реБрджреНрдзрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛рдд:curl -IрдЖрдгрд┐curl -X OPTIONS -iрдХрд░реВрди рдкрд╛рд╣рд╛).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рддрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдзрди тАФ curl, browsers, load balancers, caches,
AWS API Gateway, рддреБрдордЪрд╛ framework тАФ рд╣реАрдЪ рдиреЗрдордХреА рд░рдЪрдирд╛ рд╕рдордЬрддреЗ.
рддреА рдЕрд╕реНрдЦрд▓рд┐рдд рдмреЛрд▓рддрд╛ рдЖрд▓реА рдХреА рддреБрдореНрд╣реА curl -v рдиреЗ рдЖрдгрд┐ docs рд╢рд┐рд╡рд╛рдп рдХреЛрдгрддреЗрд╣реА API debug рдХрд░реВ рд╢рдХрддрд╛:
method рдЖрдгрд┐ path рд╕рд╛рдВрдЧрддрд╛рдд рддреБрдореНрд╣реА рдХрд╛рдп рдорд╛рдЧрд┐рддрд▓реЗ, status рд╕рд╛рдВрдЧрддреЛ рдЪреВрдХ рдХреЛрдгрд╛рдЪреА
рдЖрд╣реЗ, headers рд╕рд╛рдВрдЧрддрд╛рдд рдкреБрдвреЗ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
school_api.py рдордзрд▓реЗ send(status, body, headers) рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рдХреНрдХрд╛ рд▓рд┐рд╣рд┐рддреЗ:
status line, X-API-Version, X-Request-Id, Content-Type, body.
error(status, code, message) рдкреНрд░рддреНрдпреЗрдХ рдирдХрд╛рд░ рдПрдХрд╛рдЪ рдЖрдХрд╛рд░рд╛рдд рд▓рд┐рд╣рд┐рддреЗ тАФ
рд╣реЗ рдЗрддрдХреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдХрд╛ рдЖрд╣реЗ рддреЗ рдзрдбрд╛ 07 рд╕рд╛рдВрдЧрддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 api/school_api.py # terminal 1
curl -v http://127.0.0.1:8080/v1/students/2 # terminal 2 тАФ read the > and < lines
curl -i http://127.0.0.1:8080/v1/students/99 # the 404 stamp + the error body
curl -i -X POST http://127.0.0.1:8080/v1/students -d 'not json' # 415: wrong paper
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
curl -v рддреБрдордЪреНрдпрд╛ request рдЪреНрдпрд╛ рдУрд│реА > рдиреЗ рд╕реБрд░реВ рдЭрд╛рд▓реЗрд▓реНрдпрд╛ (method, path, Host, Accept) рдЖрдгрд┐ рдЙрддреНрддрд░ < рдиреЗ рд╕реБрд░реВ рдЭрд╛рд▓реЗрд▓реЗ (HTTP/1.0 200 OK, ETag, Cache-Control, Content-Type) рджрд╛рдЦрд╡рддреЛ. 404 рд▓рд╛ error.code = not_found рдЕрд╕рд▓реЗрд▓реА JSON body рдЕрд╕рддреЗ. -d 'not json' call auth рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреАрдЪ 415 unsupported_media_type рдиреЗ рдирд╛рдХрд╛рд░рд▓рд╛ рдЬрд╛рддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА request рдЖрдгрд┐ response text рдореНрд╣рдгреВрди рд╡рд╛рдЪреВ рд╢рдХрддрд╛, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░ рдЪрд╛рд░ рд╢рд┐рдХреНрдХрд╛-рдХреБрдЯреБрдВрдмрд╛рдВрдкреИрдХреА рдХреЛрдгрддреНрдпрд╛ рдХреБрдЯреБрдВрдмрд╛рддрд▓реЗ рдЖрд╣реЗ рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд│рддреЗ тАФ API debugging рдЪрд╛ 80 % рднрд╛рдЧ рд╣рд╛рдЪ рдЖрд╣реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдлрдХреНрдд body рд╡рд╛рдЪрдгреЗ тАФ рдЕрд░реНрдзрд╛ рдЕрд░реНрде status code рдЖрдгрд┐ headers рдордзреНрдпреЗ рдЕрд╕рддреЛ
Content-Type: application/jsonрд╢рд┐рд╡рд╛рдп JSON рдкрд╛рдард╡рдгреЗ тАФ рдЕрдиреЗрдХ servers, рдЖрдордЪреНрдпрд╛рд╕рдХрдЯ, рддреЗ рдирд╛рдХрд╛рд░рддрд╛рдд (415)- 4xx рдЖрдгрд┐ 5xx рд╕рд╛рд░рдЦреЗрдЪ рдорд╛рдирдгреЗ тАФ рдПрдХрд╛рдЪрд╛ рдЕрд░реНрде рддреБрдордЪреА slip рджреБрд░реБрд╕реНрдд рдХрд░рд╛, рджреБрд╕рд▒реНрдпрд╛рдЪрд╛ рдЕрд░реНрде рдерд╛рдВрдмрд╛ рдЖрдгрд┐ retry рдХрд░рд╛
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: load balancers 5xx рдореЛрдЬрддрд╛рдд, caches
Cache-Controlрдкрд╛рд│рддрд╛рдд, alerting рдкреНрд░рддреНрдпреЗрдХ status рдХреБрдЯреБрдВрдмрд╛рдЪреНрдпрд╛ error рджрд░рд╛рд╡рд░ рд╡рд╛рдЬрддреЗ. рдЖрдд{"ok": false}рдареЗрд╡реВрди200рдкрд░рдд рдХрд░рдгрд╛рд░реЗ API рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдзрдирд╛рд▓рд╛ рджрд┐рд╕рддрдЪ рдирд╛рд╣реА.
тПня╕П рдкреБрдвреЗ
Slips рд╡рд░рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрдирд╛ рдирд╛рд╡реЗ рдХрд╢реА рджреНрдпрд╛рдпрдЪреА? рдлрд╛рдЗрд▓рд┐рдВрдЧ рдХрдкрд╛рдЯрд╛рдВрддрд▓реА рдирд╛рдореЗ тАФ REST resources рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рдХрд░рд╛рдпрд▓рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рд▓реЗрд▓реА рдХреНрд░рд┐рдпрд╛рдкрджреЗ.
git checkout lesson-03-rest-resources