JAVA REST API

参考链接:
CodeSail | RESTful API Design
Create REST APIs with JAX-RS 2.0
菜鸟教程 | RESTFul API
RestFul API 命名

什么是REST

REST是REpresentational State Transfer的缩写,是一种分布式超媒体系统的架构风格。

怎么写REST API

1. 基本概念
  • 使用HTTP方法,常用的有:GET(读取), POST(新增), PUT/PATCH(更新), DELETE(删除)。
  • 面向资源的,一个资源代表一个URI,如 /articles。
  • API由HTTP方法和URI组成,如 GET /articles。
  • API可以表示一个资源或操作。如 POST /articles 表示“新增一个article“。
  • 状态码有5个类别:1xx 相关信息, 2xx 成功, 3xx 重定向, 4xx 客户端错误 and 5xx 服务器错误。
2. 响应格式

不要返回纯文本,推荐JSON。

3. 不要使用“动词“
GET /articles       /**正确示范**/
GET /getArticles    /**错误示范**/
POST /articles          /**正确示范**/
POST /createArticles    /**错误示范**/
4. 用复数形式表示一个集合
GET /artiles/{id}      /**正确示范**/
GET /artile/{id}       /**错误示范**/
POST /artiles     /**正确示范**/
POST /artile       /**错误示范**/
5. 返回错误信息

服务器错误时,在返回体中返回错误信息。

{
    "error":  "您没有权限。"
}
6. 关注状态码

服务器错误时,不要返回200状态码。

/**错误示范**/ 
/**前端需要结合状态码和status判断服务器响应是否成功**/
HTTP/1.1 200 OK
Content-Type: text/html

{
    "code": "-1",
    "data": {
        "error": "Expected at least two items in list."
    }
}
/**正确示范**/

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
    "error": "Expected at least two items in list."
}
7. 使用一致性的状态码

例如,你在某处使用POST /articles 创建article成功,返回 “201 Created“,那么其它地方使用POST 创建成功时,也必须返回 “201 Created“。

/**推荐**/

GET: 200 OK
POST: 201 Created
PUT: 200 OK
PATCH: 200 OK
DELETE: 204 No Content
8. 避免多级URI,使用QueryString过滤集合
 /**普通示范**/ 
GET /authors/1/articles    
GET /authors/1/categories/2

 /**更好的示范**/ 
GET /articles?author_id=12   
GET /authors/1?categories=2
10. “401 Unauthorized“ 和 “403 Forbidden“ 的区别
  • 当用户未提供授权,返回401 Unauthorized。
  • 当用户使用错误的授权,返回403 Forbidden。
11. 使用“202 Accepted“
  • 资源将会创建,但是目前还在创建中。
  • 资源已经创建过了。
12. 不要使用尾斜杠“/“
GET /articles     
GET /articles    /**更优雅**/
13. 使用“-“提高URI的可读性
GET /my_doc/my_file    /** 避免使用"_" **/
GET /my-doc/my-file    /**更优雅**/
14. 使用小写字母提高URI的可读性
GET /myDoc/myFile      /**不推荐**/
GET /my-doc/my-file    /**更优雅**/
15. 不要文件后缀
GET /myDoc/myFile.xml      /**不推荐**/
GET /my-doc/my-file        /**更优雅**/
(1)项目简介 这个demo很简单,是一个记账小工程。用户可以注册、修改密码,可以记账、查找记账记录等。 (2)接口介绍 用户操作相关: post /users 用户注册 post /users/login 用户登录(这里我把login当成一个名词) put /users/pwd?userId=xxx&sign=xxx 用户修改密码 delete /users?uerId=xxx&sign=xxx 删除用户 记账记录操作相关: post /records?userId=xxx&sign=xxx 增加一条记账记录 get /records/:id?userId=xxx&sign=xxx 查询一条记账记录详情 put /records/:id?userId=xxx&sign=xxx 修改一条记账记录详情 get /records?查询参数&userId=xxx&sign=xxx 分页查询记账记录 delete /records/:id?userId=xxx&sign=xxx 删除一条记账记录 其中url中带sign参数的表示该接口需要鉴权,sign必须是url中最后一个参数。具体的鉴权方法是:用户登录后,服务器生成返回一个token,然后客户端要注意保存这个token,需要鉴权的接口加上sign签名,sign=MD5(url+token),这样可以避免直接传token从而泄露了token。这里我觉得接口最好还带一个时间戳参数timestamp,然后可以在服务端比较时间差,从而避免重放攻击。而且这样还有一个好处,就是如果有人截获了我们的请求,他想伪造我们的请求则不得不改时间戳参数(因为我们在服务器端会比较时间),这样一来sign势必会改变,他是无法得知这个sign的。如果我们没有加时间戳参数的话,那么,他截获了请求url,再重发这个请求势必又是一次合法的请求。我在这里为了简单一些,就不加时间戳了,因为这在开发测试阶段实在是太麻烦了。 (3)关于redis和数据库的说明 服务端在用户登录后,生成token,并将token保存到redis中。后面在接口鉴权的时候会取出token计算签名MD5(除sign外的url+token),进行比对。 这个demo搭建了一个redis主从复制,具体可以参考:http://download.csdn.net/detail/zhutulang/9585010 数据库使用mysql,脚本在 src/main/resources/accounting.sql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值