---
title: RestFul API ç®ææç¨
category: 代ç è´¨é
---

è¿ç¯æç« ç®åèèå端ç¨åºåå¿
å¤ç RESTful API ç¸å
³çç¥è¯ã
å¼å§æ£å¼ä»ç» RESTful API ä¹åï¼æä»¬éè¦é¦å
ææ¸
ï¼**API å°åºæ¯ä»ä¹ï¼**
## ä½ä¸º APIï¼

**APIï¼Application Programming Interfaceï¼** ç¿»è¯è¿æ¥æ¯åºç¨ç¨åºç¼ç¨æ¥å£çææã
æä»¬å¨è¿è¡å端å¼åçæ¶åï¼ä¸»è¦çå·¥ä½å°±æ¯ä¸ºå端æè
å
¶ä»å端æå¡æä¾ API æ¯å¦æ¥è¯¢ç¨æ·æ°æ®ç API ã

使¯ï¼ API ä¸ä»
ä»
代表åç«¯ç³»ç»æ´é²çæ¥å£ï¼åæ¡æ¶ä¸æä¾çæ¹æ³ä¹å±äº API çèç´ã
ä¸ºäºæ¹ä¾¿å¤§å®¶çè§£ï¼æåå举å 个ä¾å ð°ï¼
1. ä½ éè¿æçµåç½ç«æç´¢ææååï¼çµåç½ç«çå端就è°ç¨äºå端æä¾äºæç´¢ååç¸å
³ç APIã
2. ä½ ä½¿ç¨ JDK å¼å Java ç¨åºï¼æ³è¦è¯»åç¨æ·çè¾å
¥çè¯ï¼ä½ å°±éè¦ä½¿ç¨ JDK æä¾ç IO ç¸å
³ç APIã
3. ......
ä½ å¯ä»¥æ API ç解为ç¨åºä¸ç¨åºä¹é´éä¿¡çæ¡¥æ¢ï¼å
¶æ¬è´¨å°±æ¯ä¸ä¸ªå½æ°èå·²ãå¦å¤ï¼API ç使ç¨ä¹ä¸æ¯æ²¡æç« æ³çï¼å®çè§åç±ï¼æ¯å¦æ°æ®è¾å
¥åè¾åºçæ ¼å¼ï¼API æä¾æ¹å¶å®ã
## ä½ä¸º RESTful APIï¼
**RESTful API** ç»å¸¸ä¹è¢«å«å **REST API**ï¼å®æ¯åºäº REST æå»ºç APIãè¿ä¸ª REST å°åºæ¯ä»ä¹ï¼æä»¬åæå¨è®²ï¼æ¶åå°çæ¦å¿µæ¯è¾å¤ã
å¦æä½ ç RESTful API ç¸å
³çæç« çè¯ä¸è¬é½æ¯è¾æ¦æ¶©é¾æï¼ä¸»è¦æ¯å 为 REST æ¶åå°çä¸äºæ¦å¿µæ¯è¾é¾ä»¥çè§£ã使¯ï¼å®é
ä¸ï¼æä»¬å¹³æ¶å¼åç¨å°ç RESTful API çç¥è¯é常ç®åä¹å¾å®¹ææ¦æ¬ï¼
举个ä¾åï¼å¦ææç»ä½ ä¸é¢ä¸¤ä¸ª API ä½ æ¯ä¸æ¯ç«é©¬è½ç¥éå®ä»¬æ¯å¹²ä»ä¹ç¨çï¼è¿å°±æ¯ RESTful API ç强大ä¹å¤ï¼
```
GET /classesï¼ååºææç级
POST /classesï¼æ°å»ºä¸ä¸ªç级
```
**RESTful API å¯ä»¥è®©ä½ çå° URL+Http Method å°±ç¥éè¿ä¸ª URL æ¯å¹²ä»ä¹çï¼è®©ä½ çå°äº HTTP ç¶æç ï¼status codeï¼å°±ç¥é请æ±ç»æå¦ä½ã**
åå±ä»¬å¨å¼åè¿ç¨ä¸è®¾è®¡ API çæ¶åä¹åºè¯¥è³å°è¦æ»¡è¶³ RESTful API çæåºæ¬çè¦æ±ï¼æ¯å¦æ¥å£ä¸å°½é使ç¨åè¯ï¼ä½¿ç¨ `POST` 请æ±åå»ºèµæºï¼`DELETE` 请æ±å é¤èµæºççï¼ç¤ºä¾ï¼`GET /notes/id`ï¼è·åæä¸ªæå® id çç¬è®°çä¿¡æ¯ï¼ã
## 解读 REST
**REST** æ¯ `REpresentational State Transfer` ç缩åãè¿ä¸ªè¯ç»çç¿»è¯è¿æ¥å°±æ¯â**表ç°å±ç¶æè½¬å**âã
è¿æ ·ç解起æ¥çæ¯æ¦æ¶©ï¼å®é
ä¸ REST çå
¨ç§°æ¯ **Resource Representational State Transfer** ï¼ç´ç½å°ç¿»è¯è¿æ¥å°±æ¯ **âèµæºâå¨ç½ç»ä¼ è¾ä¸ä»¥æç§â表ç°å½¢å¼âè¿è¡âç¶æè½¬ç§»â** ãå¦æè¿æ¯ä¸è½ç»§ç»çè§£ï¼è¯·ç»§ç»å¾ä¸çï¼ç¸ä¿¡ä¸é¢ç讲解ä¸å®è½è®©ä½ çè§£å°åºå¥æ¯ REST ã
æä»¬åå«å¯¹ä¸é¢æ¶åå°çæ¦å¿µè¿è¡è§£è¯»ï¼ä»¥ä¾¿å æ·±çè§£ï¼å®é
ä¸ä½ ä¸éè¦ææä¸é¢è¿äºæ¦å¿µï¼ä¹è½çææä¸ä¸é¨åè¦ä»ç»å°çå
容ãä¸è¿ï¼ä¸ºäºæ´å¥½å°è½è·å«äººæ¯æ¯ âRESTful APIâæå»ºè®®ä½ è¿æ¯è¦å¥½å¥½çè§£ä¸ä¸ï¼
- **èµæºï¼Resourceï¼**ï¼æä»¬å¯ä»¥æçå®çå¯¹è±¡æ°æ®ç§°ä¸ºèµæºãä¸ä¸ªèµæºæ¢å¯ä»¥æ¯ä¸ä¸ªéåï¼ä¹å¯ä»¥æ¯å个个ä½ãæ¯å¦æä»¬çç级 classes æ¯ä»£è¡¨ä¸ä¸ªéåå½¢å¼çèµæºï¼èç¹å®ç class 代表å个个ä½èµæºãæ¯ä¸ç§èµæºé½æç¹å®ç URIï¼ç»ä¸èµæºæ è¯ç¬¦ï¼ä¸ä¹å¯¹åºï¼å¦ææä»¬éè¦è·åè¿ä¸ªèµæºï¼è®¿é®è¿ä¸ª URI å°±å¯ä»¥äºï¼æ¯å¦è·åç¹å®çç级ï¼`/class/12`ãå¦å¤ï¼èµæºä¹å¯ä»¥å
å«åèµæºï¼æ¯å¦ `/classes/classId/teachers`ï¼ååºæä¸ªæå®ççº§çææèå¸çä¿¡æ¯
- **表ç°å½¢å¼ï¼Representationalï¼**ï¼"èµæº"æ¯ä¸ç§ä¿¡æ¯å®ä½ï¼å®å¯ä»¥æå¤ç§å¤å¨è¡¨ç°å½¢å¼ãæä»¬æ"èµæº"å
·ä½åç°åºæ¥ç形弿¯å¦ `json`ï¼`xml`ï¼`image`,`txt` ççå«åå®ç"表ç°å±/表ç°å½¢å¼"ã
- **ç¶æè½¬ç§»ï¼State Transferï¼**ï¼å¤§å®¶ç¬¬ä¸ç¼çå°è¿ä¸ªè¯è¯ä¸å®ä¼å¾æµé¼ï¼å
å¿ BBï¼è¿å°¼çæ¯å¥åï¼ å¤§ç½è¯æ¥è¯´ REST ä¸çç¶æè½¬ç§»æ´å¤å°æè¿°çæå¡å¨ç«¯èµæºçç¶æï¼æ¯å¦ä½ éè¿å¢å æ¹æ¥ï¼éè¿ HTTP å¨è¯å®ç°ï¼å¼èµ·èµæºç¶æçæ¹åãps:äºèç½éä¿¡åè®® HTTP åè®®ï¼æ¯ä¸ä¸ªæ ç¶æåè®®ï¼ææçèµæºç¶æé½ä¿å卿å¡å¨ç«¯ã
综åä¸é¢çè§£éï¼æä»¬æ»ç»ä¸ä¸ä»ä¹æ¯ RESTful æ¶æï¼
1. æ¯ä¸ä¸ª URI 代表ä¸ç§èµæºï¼
2. 客æ·ç«¯åæå¡å¨ä¹é´ï¼ä¼ éè¿ç§èµæºçæç§è¡¨ç°å½¢å¼æ¯å¦ `json`ï¼`xml`ï¼`image`,`txt` ççï¼
3. 客æ·ç«¯éè¿ç¹å®ç HTTP å¨è¯ï¼å¯¹æå¡å¨ç«¯èµæºè¿è¡æä½ï¼å®ç°"表ç°å±ç¶æè½¬å"ã
## RESTful API è§è

### å¨ä½
- `GET`ï¼è¯·æ±ä»æå¡å¨è·åç¹å®èµæºã举个ä¾åï¼`GET /classes`ï¼è·åææç级ï¼
- `POST`ï¼å¨æå¡å¨ä¸å建ä¸ä¸ªæ°çèµæºã举个ä¾åï¼`POST /classes`ï¼å建ç级ï¼
- `PUT`ï¼æ´æ°æå¡å¨ä¸çèµæºï¼å®¢æ·ç«¯æä¾æ´æ°åçæ´ä¸ªèµæºï¼ã举个ä¾åï¼`PUT /classes/12`ï¼æ´æ°ç¼å·ä¸º 12 çç级ï¼
- `DELETE`ï¼ä»æå¡å¨å é¤ç¹å®çèµæºã举个ä¾åï¼`DELETE /classes/12`ï¼å é¤ç¼å·ä¸º 12 çç级ï¼
- `PATCH`ï¼æ´æ°æå¡å¨ä¸çèµæºï¼å®¢æ·ç«¯æä¾æ´æ¹ç屿§ï¼å¯ä»¥çå使¯é¨åæ´æ°ï¼ï¼ä½¿ç¨çæ¯è¾å°ï¼è¿éå°±ä¸ä¸¾ä¾åäºã
### è·¯å¾ï¼æ¥å£å½åï¼
è·¯å¾åç§°"ç»ç¹"ï¼endpointï¼ï¼è¡¨ç¤º API çå
·ä½ç½åãå®é
å¼åä¸å¸¸è§çè§èå¦ä¸ï¼
1. **ç½åä¸ä¸è½æå¨è¯ï¼åªè½æåè¯ï¼API ä¸çåè¯ä¹åºè¯¥ä½¿ç¨å¤æ°ã** å 为 REST ä¸çèµæºå¾å¾åæ°æ®åºä¸ç表对åºï¼èæ°æ®åºä¸çè¡¨é½æ¯åç§è®°å½ç"éå"ï¼collectionï¼ã妿 API è°ç¨å¹¶ä¸æ¶åèµæºï¼å¦è®¡ç®ï¼ç¿»è¯çæä½ï¼çè¯ï¼å¯ä»¥ç¨å¨è¯ãæ¯å¦ï¼`GET /calculate?param1=11¶m2=33` ã
2. **ä¸ç¨å¤§å忝ï¼å»ºè®®ç¨ä¸æ - ä¸ç¨ä¸æ \_** ãæ¯å¦é请ç åæ `invitation-code`è䏿¯ ~~invitation_code~~ ã
3. **åç¨çæ¬å API**ã彿们ç API åçäºé大æ¹åèä¸å
¼å®¹åæçæ¬çæ¶åï¼æä»¬å¯ä»¥éè¿ URL æ¥å®ç°çæ¬åï¼æ¯å¦ `http://api.example.com/v1`ã`http://apiv1.example.com` ãçæ¬ä¸å¿
éè¦æ¯æ°åï¼åªæ¯æ°åç¨çæå¤ï¼æ¥æãå£èé½å¯ä»¥ä½ä¸ºçæ¬æ è¯ç¬¦ï¼é¡¹ç®å¢éè¾¾æå
±è¯å°±å¯ã
4. **æ¥å£å°½é使ç¨åè¯ï¼é¿å
使ç¨å¨è¯ã** RESTful API æä½ï¼HTTP Methodï¼çæ¯èµæºï¼åè¯ï¼è䏿¯å¨ä½ï¼å¨è¯ï¼ã
Talk is cheapï¼æ¥ä¸¾ä¸ªå®é
çä¾åæ¥è¯´æä¸ä¸å§ï¼ç°å¨æè¿æ ·ä¸ä¸ª API æä¾ç级ï¼classï¼çä¿¡æ¯ï¼è¿å
æ¬ç级ä¸çå¦çåæå¸çä¿¡æ¯ï¼åå®çè·¯å¾åºè¯¥è®¾è®¡æä¸é¢è¿æ ·ã
```
GET /classesï¼ååºææç级
POST /classesï¼æ°å»ºä¸ä¸ªç级
GET /classes/{classId}ï¼è·åæä¸ªæå®ç级çä¿¡æ¯
PUT /classes/{classId}ï¼æ´æ°æä¸ªæå®ç级çä¿¡æ¯ï¼ä¸è¬å¾åæ´ä½æ´æ°ï¼
PATCH /classes/{classId}ï¼æ´æ°æä¸ªæå®ç级çä¿¡æ¯ï¼ä¸è¬å¾åé¨åæ´æ°ï¼
DELETE /classes/{classId}ï¼å é¤æä¸ªç级
GET /classes/{classId}/teachersï¼ååºæä¸ªæå®ççº§çææèå¸çä¿¡æ¯
GET /classes/{classId}/studentsï¼ååºæä¸ªæå®ççº§çææå¦ççä¿¡æ¯
DELETE /classes/{classId}/teachers/{ID}ï¼å é¤æä¸ªæå®ç级ä¸çæå®çèå¸çä¿¡æ¯
```
åä¾ï¼
```
/getAllclasses
/createNewclass
/deleteAllActiveclasses
```
çæ¸
èµæºç屿¬¡ç»æï¼æ¯å¦ä¸å¡é对çèå´æ¯å¦æ ¡ï¼é£ä¹å¦æ ¡ä¼æ¯ä¸çº§èµæº:`/schools`ï¼èå¸: `/schools/teachers`ï¼å¦ç: `/schools/students` å°±æ¯äºçº§èµæºã
### è¿æ»¤ä¿¡æ¯ï¼Filteringï¼
妿æä»¬å¨æ¥è¯¢çæ¶åéè¦æ·»å ç¹å®æ¡ä»¶çè¯ï¼å»ºè®®ä½¿ç¨ url åæ°çå½¢å¼ãæ¯å¦æä»¬è¦æ¥è¯¢ state ç¶æä¸º active å¹¶ä¸ name 为 guidegege çç级ï¼
```
GET /classes?state=active&name=guidegege
```
æ¯å¦æä»¬è¦å®ç°å页æ¥è¯¢ï¼
```
GET /classes?page=1&size=10 //æå®ç¬¬1é¡µï¼æ¯é¡µ10ä¸ªæ°æ®
```
### ç¶æç ï¼Status Codesï¼
**ç¶æç èå´ï¼**
| 2xxï¼æå | 3xxï¼éå®å | 4xxï¼å®¢æ·ç«¯é误 | 5xxï¼æå¡å¨é误 |
| --------- | -------------- | ---------------- | --------------- |
| 200 æå | 301 æ°¸ä¹
éå®å | 400 éè¯¯è¯·æ± | 500 æå¡å¨é误 |
| 201 å建 | 304 èµæºæªä¿®æ¹ | 401 æªææ | 502 ç½å
³é误 |
| | | 403 ç¦æ¢è®¿é® | 504 ç½å
³è¶
æ¶ |
| | | 404 æªæ¾å° | |
| | | 405 è¯·æ±æ¹æ³ä¸å¯¹ | |
## RESTful çæè´ HATEOAS
> **RESTful çæè´æ¯ hateoas ï¼ä½æ¯è¿ä¸ªåºæ¬ä¸ä¼å¨å®é
项ç®ä¸ç¨å°ã**
ä¸é¢æ¯ RESTful API æåºæ¬çä¸è¥¿ï¼ä¹æ¯æä»¬å¹³æ¶å¼åè¿ç¨ä¸æå®¹æå®è·µå°çãå®é
ä¸ï¼RESTful API æå¥½åå° Hypermediaï¼å³è¿åç»æä¸æä¾é¾æ¥ï¼è¿åå
¶ä» API æ¹æ³ï¼ä½¿å¾ç¨æ·ä¸æ¥ææ¡£ï¼ä¹ç¥éä¸ä¸æ¥åºè¯¥åä»ä¹ã
æ¯å¦ï¼å½ç¨æ·å `api.example.com` çæ ¹ç®å½ååºè¯·æ±ï¼ä¼å¾å°è¿æ ·ä¸ä¸ªè¿åç»æ
```javascript
{"link": {
"rel": "collection https://www.example.com/classes",
"href": "https://api.example.com/classes",
"title": "List of classes",
"type": "application/vnd.yourformat+json"
}}
```
ä¸é¢ä»£ç è¡¨ç¤ºï¼ææ¡£ä¸æä¸ä¸ª `link` 屿§ï¼ç¨æ·è¯»åè¿ä¸ªå±æ§å°±ç¥éä¸ä¸æ¥è¯¥è°ç¨ä»ä¹ API äºã`rel` 表示è¿ä¸ª API ä¸å½åç½åçå
³ç³»ï¼collection å
³ç³»ï¼å¹¶ç»åºè¯¥ collection çç½åï¼ï¼`href` 表示 API çè·¯å¾ï¼title 表示 API çæ é¢ï¼`type` 表示è¿åç±»å `Hypermedia API` ç设计被称为[HATEOAS](http://en.wikipedia.org/wiki/HATEOAS)ã
å¨ Spring 䏿ä¸ä¸ªå«å HATEOAS ç API åºï¼éè¿å®æä»¬å¯ä»¥æ´è½»æ¾çå建åºç¬¦å HATEOAS 设计ç APIãç¸å
³æç« ï¼
- [å¨ Spring Boot ä¸ä½¿ç¨ HATEOAS](https://blog.aisensiy.me/2017/06/04/spring-boot-and-hateoas/)
- [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) (Spring å®ç½ )
- [An Intro to Spring HATEOAS](https://www.baeldung.com/spring-hateoas-tutorial)
- [spring-hateoas-examples](https://github.com/spring-projects/spring-hateoas-examples/tree/master/hypermedia)
- [Spring HATEOAS](https://spring.io/projects/spring-hateoas#learn) (Spring å®ç½ )
## åè
-