• REST API注意事项


    RFC一致性

    Methods

    GET: 获取某个资源,幂等且无副作用。

    POST: 创建一个新的资源。

    PUT: 替换某个已有的资源。幂等有副作用。

    PATCH: 修改某个已有的资源。

    DELETE:删除某个资源。幂等有副作用。

    Headers

    Accept:服务器需要返回什么样的content。

    If-Modified-Since/If-None-Match:如果客户端提供某个条件,那么当这条件满足时,才返回数据,否则返回304 not modified。

    If-Match:在对某个资源做PUT/PATCH/DELETE操作时,服务器应该要求客户端提供If-Match头,只有客户端提供的Etag与服务器对应资源的Etag一致,才进行操作,否则返回412 precondition failed。

    返回恰当的Status Code

    安全性

    一致性,机密性,和可用性

    请求数据验证

    Request headers是否合法:如果出现了某些不该有的头,或者某些必须包含的头没有出现或者内容不合法,根据其错误类型一律返回4xx。
    可以在HTTP头中增加X-Request-ID标识调用者身份。
    示例:

    GET /photos/puppy.jpg HTTP/1.1
    X-Request-ID: 1pvs6edg31p92bld853plok8b4

    Request URI和Request body是否合法:如果请求带有了不该有的数据,或者某些必须包含的数据没有出现或内容不合法,一律返回4xx。

    数据完整性验证

    数据完整性验证的底线是:保证要修改的数据和服务器里的数据是一致的 —— 这是通过Etag来完成。
    Etag可以认为是某个资源的一个唯一的版本号。当客户端请求某个资源时,该资源的Etag一同被返回,而当客户端需要修改该资源时,需要通过"If-Match"头来提供这个Etag。
    服务器检查客户端提供的Etag是否和服务器同一资源的Etag相同,如果相同,才进行修改,否则返回412 precondition failed。

    访问控制

    REST API需要清晰定义哪些操作能够公开访问,哪些操作需要授权访问。

    在HTTP协议之上处理授权有很多方法,如HTTP BASIC Auth,OAuth,HMAC Auth等,其核心思想都是验证某个请求是由一个合法的请求者发起。

    HMAC Auth保证一致性:请求的数据在传输过程中未被修改,因此可以安全地用于验证请求的合法性。
    HMAC主要在请求头中使用两个字段:Authorization和Date(或X-Auth-Timestamp)。
    Authorization字段的内容由":"分隔成两部分,":"前是access-key,":"后是HTTP请求的HMAC值。 在做HMAC的时候,request headers中的request method,request URI,Date/X-Auth-Timestamp等header会被计算在HMAC中。
    示例:

    GET /photos/puppy.jpg HTTP/1.1
    X-Auth-Timestamp: Mon, 26 Mar 2007 19:37:58 +0000
    Authorization: AKIAIOSFODNN7EXAMPLE:frJIUN8DYpKDtOLCwo//yllqDzg=

    将时间戳计算在HMAC中的好处是可以防止replay攻击。一个请求携带的时间戳,和该请求到达服务器时服务器的时间戳,中间差别太大,超过某个阈值(比如说120s),那么可以认为是replay,服务器主动丢弃该请求。

    需要保证传输内容安全,使用HTTPS加密传输。

    其他

    rate limiting:访问限制。

    metrics:服务器应该收集每个请求的访问时间,到达时间,处理时间,latency,便于了解API的性能和客户端的访问分布,以便更好地优化性能和应对突发请求。

    docs:丰富的接口文档 —— API的调用者需要详尽的文档来正确调用API,可以用swagger来实现。

    hooks/event propogation:其他系统能够比较方便地与该API集成。

    参考文章:http://kb.cnblogs.com/page/521718/
    作者: programmer_life
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/jonathanzhao/p/5165253.html
Copyright © 2020-2023  润新知