REST风格笔记

    这一篇主要是看了FB的覃超大大的文章,做了一些笔记和自己的思考。
    定义: 用URL来定义资源,用HTTP(GET/POST/DELETE/DETC)来描述操作。
    1. REST描述的是网络的client和server的一种交互方式,REST本身不实用,实用的是何如设计RESTful API(REST风格的网络接口)
    2. Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心:
        www.baidu.com/v1/newsfeed :获取某人的新鲜事
        www.baidu.com/v1/friends  :获取某人的好友列表
        www.baidu.com/v1/profile  :获取某人的详细信息
    3.用HTTP协议的动词来实现资源的添加,修改,删除等操作,即通过HTTP动词来实现资源的状态流转:
        GET    用来获取资源
        POST   用来新建资源(也可以用于更新资源)
        PUT    用来更新资源
        DELETE 用来删除资源
        比如:  DELETE http://www.baidu.com/v1/friends : 删除某人的好友 (在http parameter指定好友id)
               POST   http://www.baidu.com/v1/friends : 添加好友
               UPDATE http://www.baidu.com/v1/friends : 更新个人资源
        禁止使用: GET  http://www.baidu.com/v1/delFriends
        
        论文是这样描述的:
        GET     /tasks -- display all tasks
        POST    /tasks -- create a new task
        GET     /tasks/{id} -- display a task by ID
        PUT     /tasks/{id} -- update a task by ID
        DELETE  /tasks/{id} -- delete a task by ID
    4.Server和Client之间传递某资源的一种表现形式,比如用JSON/XML传输文本,或者用JPG来传输图片,也可以压缩HTTP传输的数据(on-wire data compression)
    5.用HTTP Status Code 来传递Server的状态信息(200 -- 成功,500 -- server 代码问题)
    
    ----------------------------------------------------
    REST : Resource Representational State Transfer  资源在网络中以某种表现形式进行状态转移
       Resource : 资源,即数据
       Representational : 某种表现形式,比如使用的是json/xml/jpeg
       State Transfer   : 状态变化,通过HTTP动词来实现
     
    首先我们要知道为什么要使用RESTful结构:
       由于各种类型Client层出不穷,RESTful可以通过一套统一的接口为web/ios/Android提供服务
    Server的API如何设计才能满足RESTful的要求呢?
    1. api version可以放在URL里面,也可以用HTTP的header
       /api/v1/
       
    2. URI使用名词而不是动词,并且推荐使用复数
       BAD:  /getProducts
             /listOrders
             /retrieveClientByOrder?orderId=1
       GOOD: GET  /products        : will return the list of all products
             POST /products        : will add a product to the collection
             GET  /products/4      : will retrieve product #4
             PATCH/PUT /products/4 : will update product #4
             
    3. 保证 HEAD 和 GET 方法是安全的,不会对资源状态有所改变(污染)。比如严格杜绝如下情况:      
             GET /deleteProduct?id=1
             
    4. 资源的地址推荐用嵌套结构。比如:
       GET /friends/10375923/profile
       UPDATE /profile/primaryAddress/city
       
    5. 警惕返回结果的大小。如果过大,及时进行分页(pagination)或者加入限制(limit)。HTTP协议支持分页(Pagination)操作,在Header中使用 Link 即可。  
    6. 使用正确的HTTP Status Code表示访问状态   
    7. 在返回结果用明确易懂的文本(String。注意返回的错误是要给人看的,避免用 1001 这种错误信息),而且适当地加入注释。
    8. 关于安全:自己的接口就用https,加上一个key做一次hash放在最后即可。考虑到国情,HTTPS在无线网络里不稳定,可以使用Application Level的加密手段把整个HTTP的payload加密。有兴趣的朋友可以用手机连上电脑的共享Wi-Fi,然后用Charles监听微信的网络请求(发照片或者刷朋友圈)。如果是平台的API,可以用成熟但是复杂的OAuth2,
    新浪微博这篇: http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E
    
    spring mvc :  https://spring.io/guides/gs/rest-service/
    可以好好了解一下这边文章:http://www.infoq.com/cn/articles/webber-rest-workflow/
    
https://www.zhihu.com/question/27785028    
  zhihu.com,表示全网可见,在http://zhihu.com这个包里
  question就是函数名
  27785028是路径参数,表示题号
  当我回答你的时候,请求的是POST下的重载,我输入的内容就作为报文参数
  当知友访问这个链接的时候,浏览器接收到的http响应就是GET重载下的返回值


posted @ 2016-05-07 21:00  junjin4838  阅读(233)  评论(0编辑  收藏  举报