参考: http://www.ibm.com/developerworks/cn/web/1103_chenyan_restapi/

规划好 资源标示结构 和 URI模式, 是API设计成功的关键

原创文章,转载请注明:http://www.cnblogs.com/ganiks/

  1. 规划资源标识结构和URI模式

    1. 规划基本资源类型

      • 针对一个文档的评论, URI 模式可以设计成如下:/ 文件夹 / [ 文件夹名 ] / 文件 / [ 文件名 ] / 评论 / [ 评论唯一标示 ]
    2. 规划集合资源类型
      • 使用过滤条件

        • / 环境工程系 / 学生 ? 籍贯 = 北京 & 性别 = 女
      • 使用排序
        • ?sortOrder=asc&sortField=age
      • 使用分页
        • / 所有学生 ?page=5&pagesize=50
    3. 一些特殊资源类型
      • 如果我们来定义一个新的集合 ----“我检出的文档”,用创建一个集合资源来对应检出(创建一个文档锁),用删除一个集合资源来对应检入(删除一个文档锁)
      • 在 REST 这个以名词为核心的构架结构中,当你遇到一些动词特性比较强的操作,而又很难用原始资源的增删改查来匹配的时候,不妨换个思路, 通过引入新的逻辑资源集合的方式, 来进行 API 的设计与规划。
  2. 理解和使用内容协商
    1. 使用URL参数进行内容协商

      • http://restapi/news/26?format=xml
      • 使用 URL 参数,简单灵活,但是也由此带来了设计上的随意和不标准;过多的参数会导致 URL 的可读性变差,更有甚者,可能会导致 URL 过长,超出规范,API 请求无法执行
    2. 使用Accept头进行内容协商
      • Accept:application/json,text/html
      • Accept-Charset:utf-8
      • Accept-Encoding:gzip,deflate,sdcn
      • Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
    3. 使用URI模式进行内容协商
  3. 正确的使用HTTP响应代码
    • 200 OK
    • 201 Created
    • 202 Accepted
    • 204 No Content
    • 301 Moved Permanently
    • 302 Found
    • 304 Not Modified
    • 305
    • 400 Bad Request
    • 401 UnAuthorized
    • 403 Forbidden
    • 404 Not Found
    • 405 Method Not Allowed
    • 500 Internal Server Error
    • 501
    • 502 Bad GateWay
    • 504 GateWay Timeout
    • 505
  4. 使用HTTP头处理缓存
    • 缓存控制

      • Cache-control

        • private
        • no-cache
        • max-age=600
        • must-revalidate
      • Expires
    • 条件请求与电子标签
      • 很多时候,内容可能几个小时甚至几天都不会发生变动
      • HTTP头中返回内容的最后修改时间Last-Modified
      • 根据服务器内容生成电子标签ETag
      • 下次请求的时候会使用If-Modified-Since或者If-None-Match头信息把上次请求到的时间戳或者Etag传给服务器,服务器端进行判断后:
        • 返回给用户最新的内容
        • 返回HTTP304,内容没有变化
  5. 使用HTTP头处理并发
    • 条件请求

      • 在发出修改请求的同时,在HTTP头中使用If-Not-Modified-Since或者If-Match头信息,把获取数据时得到的时间戳或者电子标签传给服务器
      • 服务器通过这个与当前内容比较,可知修改请求是否是针对当前内容提出的。
        • 是,则修改
        • 不是,返回HTTP412(未满足前提条件)
  6. 更好的使用数据冗余和链接元素
    • 为了保证 API 的灵活与效率,我们可以提供一个开关参数,如 includeAircraftDetail=true
    • 我们要展示一个文件夹下面所有的文件,并允许用户察看每个文件都允许哪些人编辑,哪些人下载以及将某文件放入收藏夹。这时候,我们可以考虑将这些可以执行的操作的 API 都用链接元素的方式返回给客户端,这样,开发者无需自己拼接 API 调用的 URL,就可以使用,从而降低代码复杂度。

Restful API 最佳实践 (理论篇)的更多相关文章

  1. 我所理解的Restful API最佳实践

    一直在公司负责API数据接口的开发,期间也遇到了不小的坑,本篇博客算是做一个小小的记录. 1. 不要纠结于无意义的规范    在开始本文之前,我想先说这么一句:RESTful 真的很好,但它只是一种软 ...

  2. 我所认为的RESTful API最佳实践

    我所认为的RESTful API最佳实践 不要纠结于无意义的规范 在开始本文之前,我想先说这么一句:RESTful 真的很好,但它只是一种软件架构风格,过度纠结如何遵守规范只是徒增烦恼,也违背了使用它 ...

  3. REST与RESTFul API最佳实践

    我经常会面试一些做PHP的开发者,让我很奇怪的是,10个人总有8个多不知道什么是REST服务,甚至是没有听说过.但RESTFul API已经是现在互联网里对外开放接口的主流模式,可参考: 豆瓣API  ...

  4. Restful Api 最佳实践

    Web APIs has become an very important topic in the last year. We at M-Way Solutions are working ever ...

  5. RESTFul API最佳实践

    RESTful API最佳实践 RESTful API 概述 基本概念 REST 英文全称:Representational State Transfer,直译为:表现层状态转移.首次是由Roy Th ...

  6. RESTful API 最佳实践(转)

    原文:http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html 阮一峰老师的文章,他的文章把难懂的东西讲的易懂 RE ...

  7. RESTful API 最佳实践----转载阮一峰

    文章地址http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

  8. 我们必须要知道的RESTful服务最佳实践

    看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标 ...

  9. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

随机推荐

  1. 兼容firefox的iframe高度自适应代码

    网上关于iframe高度自适应的代码有很多,但比较杂乱,本文根据实用性整理了以下代码: JavaScript部分: 折叠JavaScript Code复制内容到剪贴板 <script type= ...

  2. POJ C程序设计进阶 编程题#2:字符串中次数第2多的字母

    编程题#2:字符串中次数第2多的字母 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536k ...

  3. CentOS6.X安装vsftpd服务

    #-----------------CentOS6.X安装VSFTPD服务 #! /bin/sh #1.关闭selinux setenforce 0 sed -i 's/enforcing/disab ...

  4. Outlook 2007无法打开链接"由于本机的限制 该操作已被取消"

    编写人:CC阿爸 2014-2-17 近来在日常维护中,经常性的遇到用户在outlook中打开链接,提示[由于本机的限制,该操作已被取消],第一次的在网上搜索到解决办法后, 第二次再处理时,又没能记住 ...

  5. 无需server-U IIS7.5 在已有的多个WEB网站上配置FTP发布

    1 新建一个用于ftp登陆的计算机用户. 操作:开始→管理工具→计算机管理→本地用户和组→用户,新建一个计算机用户,设置好用户名和密码,例如:nenkea nkscl 2 在web站点文件夹下,把新建 ...

  6. c语言学习的第10天

    #include <stdio.h> int main() { int many; printf("你想看几次?"); scanf("%d",&am ...

  7. Supporting Connected Routes to Subnet Zero

    Supporting Connected Routes to Subnet Zero IOS allows the network engineer to tell a router to eithe ...

  8. Node.js:util.inherits 面向对象特性【原型】

    /** * Created by Administrator on 2014/9/4. */ var util = require('util'); function Base() { this.na ...

  9. SQLite数据库与Contentprovider(1)

    SQlite:类似mysql的数据库.把数据保存到.db文件夹中. Contentprovider:一般用于不同进程之间的数据共享(两个APP). 手动建库:http://www.runoob.com ...

  10. lucene .NET 搜索图片 功能实现

    关于搜索部分 1想建立索引.构建jpg图片解析器,在索引时将jpg图片的exif信息及其文本信息如名称,存放路径,大小,日期等等加入索引!具体实现代码如下: public void BulidInde ...