Principes de construction d'une API REST JSON

Cette note a été écrite pour des besoins internes (pour ouvrir les yeux de collègues moins expérimentés sur le web). Mais, parce que J'ai vu assez de vélos de bureaux assez respectés, semble-t-il, - je les étale sur le moyeu Il me semble que beaucoup seront utiles.


Pourquoi


J'espère que le lecteur comprend déjà pourquoi il a vraiment besoin de l'API REST, et non d'une sorte de monstre comme SOAP. La question est de savoir pourquoi suivre certaines normes et pratiques si les navigateurs semblent vous permettre de faire ce que vous voulez.


  • La norme HTTP est la norme. Le non-respect de celui-ci est nocif pour le karma et conduit Ă  des problèmes constants de sĂ©curitĂ©, de mise en cache et d'autres navigateurs, qui ne sont pas du tout, mais suivent simplement la norme.
  • {error: "message","result":...}
  • . , api , .
  • . 200 — , .


http-


METHOD URI


METHOD — (GET, PUT ..), URI — .


— key: value
, , — , .


http, ( HTTP/1.1 200 OK), , , .


.



, — UTF-8 UTF-8, .. , , "" charset.


html- , .. JSON_UNESCAPED_UNICODE . html ( - ù ), html. / \uXXXX; &#XX;. "" .


, URI , JSON. , javascript JSON.
, . json-, "" javascript, .



Accept: application/json, */*; q=0.01

API (, html URI) application/json Accept.


Accept / , , text/javascript, , "application/json".


2


Content-Type: application/json; charset=UTF-8


Content-Type: application/json; charset=UTF-8

, ,


Content-Type: multipart/form-data

,


-----------------
Content-Type: application/json; charset=UTF-8
Content-Disposition: form-data; name="data"


-----------------
Content-Type: image/jpeg
Content-Disposition: form-data; name="avatar"; filename="user.jpg"

CSRF ( ), CSRF- ( X-CSRF-Token) , . CSRF , , CSRF .


URI


, — URI


/:entity[/:id][/?:params]


, api - ,


/api/:entity[/:id][/?:params]


:


  • entity — , , / . : users, dictionary
  • id opt. — . , . : /users/10, /dictionary/ru/apptitle
  • params opt. — (, , .). HTTP GET ( encodeURIComponent .)

URI


#^/(<entity>([a-z]\-_)+)/?(<id>([a-z][A-Z][0-9]\-_/)*)?$#

, .. , URL .


HTTP


GET /:entity/:id — getById


200 OK JSON ( - )


, id , 404 Not Found


, , .. GET HEAD . - :


Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache

GET /:entity[?param1=...¶m2=...] — get


: 200 OK JSON (.. [ ]).


, 200 OK [] .


: , — . — , , . api.


HEAD /:entity[/:id] —


GET URI, , HTTP-.


HEAD - .


pre-flight , , . , Chrome head- CORS - ( ). head- , .


(, -).


POST /:entity — :entity


JSON , .. {"field1":"value","field2":10}


201 Created ,


Location: /:entity/:new_id


.


, , id Location.


POST (RPC), 200 OK . REST RPC api — , .


, .. POST .


PUT /:entity/:id —


JSON.


204 No Data , .. .


, .. PUT - .


PATCH /:entity/:id —


, .


200 OK , getById, .


, .. PATCH .


.


DELETE /:entity/:id — , .


204 No Data , .. .


, .. DELETE 404.


OPTIONS /:entity[/:id]


, URI.


200 OK


Allow: GET, POST, ...

.



4 ( ) 5 ( ). , , text/plain ( JSON). ,


Content-Type: text/plain; charset=UTF-8

html api — , .. , .


, . . , 401 HTTP-, - react electron.


UPD . : , , (CI), . , - (.. - ) , , - - . use-case, 404 410, . 404 200 500 — .


400 Bad Request


, .


403 Forbidden


, . , . . 419


404 Not Found


, entity id .


get entity (. ).


, 418.


415 Unsupported Media Type


, . , JSON , JSON.


418 I'm a Teapot


, . , URI, .


, URI (.. ) 404, ( ). 404, 418 . — " " 410 Gone, , .. , - . 404 .


419 Authentication Timeout


, (, CSRF ). , , .


422 Unprocessable Entity


, .


, , , - .


, .


500 Internal Server Error


, .


, — console.error(err) (, ).


501 Not Implemented


, ( ) .




, -, . !

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


All Articles