REST API 设计基础
REST API 操作与 HTTP 方法的关系
请求目的 | HTTP 方法 | 相应的 SQL
------------------------------------|-----------|
创建一个资源 | POST | INSERT
读取一个现有资源 | GET | SELECT
请求现有资源的元数据 | HEAD |
更新一个现有资源 | PUT | UPDATE
更新一个现有资源的部分内容 | PATCH | UPDATE
删除一个资源 | DELETE | DELETE
返回某个 URL 所支持的 HTTP 方法 | OPTIONS |
请求回响 | TRACE |
TCP/IP 隧道(一般都未实现) | CONNECT |
注意事项:
- 如果想实现一个只读 API,只需实现 GET 方法即可
- 如果想实现一个可读写的 API,则必须至少实现 POST,但应该考虑用 PUT 和 DELETE
- 为简单起见,REST API 架构通常只使用 GET 和 POST
- 按照定义,GET、PUT 和 DELETE 是幂等的,但是 POST 和 PATCH 不是
- 通常不实现 PATCH,但是如果 API 支持 PUT,则最好实现 PATCH
- django-rest-framework 和 django-tastypie 都考虑了以上的所有问题
REST API 使用到的一些 HTTP 状态码及其含义:
HTTP 状态码 | 成功/失败 | 含义
-----------------------|-----------|
200 OK | 成功 | GET-返回资源;PUT-返回状态消息或返回资源
201 Created | 成功 | POST-返回状态消息或返回新建的资源
204 No Content | 成功 | DELETE-对删除请求的成功完成的应答
304 Unchanged | 转向 | 表示自上次请求以来无改动。用于检查 Last-Modified 和 Etag 以提高性能
400 Bad Request | 失败 | 返回错误消息,包括表单验证错误
401 Unauthorized | 失败 | 请求需要认证,但用户未提供相关信息
403 Forbidden | 失败 | 企图访问受限内容
404 Not Found | 失败 | 资源未找到
405 Method Not Allowed | 失败 | 企图使用未允许的 HTTP 方法
410 Gone | 失败 | 企图使用一个不再支持的方法。用于当新版本 API 发布而旧版本关闭时。移动应用需对它进行测试,并提醒用户升级
429 Too Many Request | 失败 | 用户在某时段内请求次数过多。
使用 django-rest-framework 实现一个简单的 JSON API
数据模型:
# flavors/models.py
from django.core.urlresolvers import reverse
from django.db import models
class Flavor(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(unique=True)
scoops_remaining = models.IntegerField(default=0)
def get_absolute_url(self):
return reverse("flavors:detail", kwargs={
"slug":