REST

先从 REST 的角度来看看 HTTP 协议规范,

  1. URL:需要操作的对象,也就是资源
  2. HTTP method:我要对该对象做什么(POST 增、DELETE 删、GET 查、PUT 和 PATCH 改
  3. HTTP status code:操作的结果

HTTP 方法

HTTP 方法有五个值得注意的性质。

  1. 前两个属性分别指示该方法的请求和响应是否应该有主体。这个比较重要,因为它涉及到了参数的传递方式。比如 GET 方法就不应该含有主体,因此 GET 方法的参数就只能编码在 url 中。
  2. 中间三个属性——安全、幂等和可缓存,定义在 RFC7231 中。
    • 安全:如果一个方法的语义在本质上是「只读」的,那么这个方法就是安全的。

      客户端向服务端的资源发起的请求如果使用了是安全的方法,就不应该引起服务端任何的状态变化,因此也是无害的。

      此RFC定义,GET, HEAD, OPTIONS 和 TRACE 这几个方法是安全的。
    • 幂等(Idempotent):幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同。

      按照RFC规范,PUT,DELETE和安全方法都是幂等的。
    • 可缓存:方法是否可以被缓存。。
  3. 该方法是否被表单支持:表单只支持 POST 与 GET

在使用 HTTP 时,我们应当遵循这五个属性。

  1. GET:请求指定的资源,它的参数用于过滤。使用 GET 的请求应该只用于获取数据。
请求是否有主体
成功的响应是否有主体
安全
幂等
可缓存
HTML 表单是否支持该方法
  1. POST:新增资源。请求主体的类型由 Content-Type 首部指定。

    POST 不是幂等的,调用多次可能导致新增多个资源!
请求是否有主体
成功的响应是否有主体
安全
幂等
可缓存 某些情况下可以
HTML 表单是否支持该方法
  1. PUT:更换指定的资源。

    PUTPOST 方法的区别在于,PUT 方法是幂等的,即调用多次与调用一次是等价的。
请求是否有主体
成功的响应是否有主体
安全
幂等
可缓存
HTML 表单是否支持该方法
  1. DELETE:删除指定的资源
请求是否有主体 可以有
成功的响应是否有主体 可以有
安全
幂等
可缓存
HTML 表单是否支持该方法
  1. PATCH:部分修改指定的资源
请求是否有主体
成功的响应是否有主体
安全
幂等
可缓存
HTML 表单是否支持该方法

REST API 将 url 看作资源,上述五个方法就是对资源的增删查改。

响应码则表示处理结果,可参考 Github API - v3PayPal API

HTTP 中的数据

请求中的数据

HTTP 请求中,数据可以放在下列几个地方:

  1. url 参数:一般只用于添加资源过滤条件。(就像 SQL 的过滤条件一样)
  2. cookie:一般只用于保存 session 信息
  3. 主体:一般不是表单数据,就是二进制数据。通过 Content-Type 指示主体的 MIME 类型。

    MIME 类型就相当于文件的拓展名,在 Web 世界通常都用 MIME 来指示文件的性质和格式。

表单是最常用的数据 POST 方式,也可以考虑使用 json。

表单编码类型

在 html 中,表单的编码方式通过 form 元素的 enctype(encode type)指定,

  1. 默认是 application/x-www-form-urlencoded(requests 也是如此),即表单使用 urlencode 编码,然后放到主体中。(而不是 url 中)
  2. 在表单中包含二进制文件时,就必须手动指定 enctype="multipart/form-data",使用多部分表单编码!否则二进制文件不会被传输。
    • 这是因为 application/x-www-form-urlencoded 使用 & 做参数分隔,它无法编码二进制文件。

而对非表单数据,将 Content-Type 设置为对应的 MIME 类型就行。

响应中的数据

服务器返回数据的手段有:

  1. Set-Cookie 设置 cookie,而且 Set-Cookie 字段可以重复,以设置多个 cookie.
  2. 主体,并使用 Content-Type 指示主体类型。

对 REST API 而言,响应最常用的 MIME 应该是 application/json.

疑问:响应是否也能用表单形式呢?

首先分析一下如果响应可以用表单,有什么好处:

  1. 一般的参数直接用 json 返回就行,因此 application/x-www-form-urlencoded 没什么用。
  2. 而如果需要同时返回二进制和别的参数,一般的方法是使用 base64 编码文件,然后包装成 json 返回。

    但是用文本编码二进制文件,会增大数据量。这时好像 multipart/form-data 确实能派上用场。

现在还剩一个问题,返回了 multipart/form-data,客户端能自动解析它么?如果能解析,那就很方便。否则可以考虑从 flask 里 copy 一份解析代码出来。。

画外:这种骚操作还是越少用越好。。。

补充

其它常用 MIME:

text/plain
text/html
text/css image/jpeg
image/png
image/gif
image/svg+xml # svg audio/mpeg # mp3
audio/ogg
audio/* video/mp4
video/webm application/*
application/json
application/xml
application/javascript
application/ecmascript
application/octet-stream # 二进制流 application/pdf
application/zip application/vnd.ms-excel # .xls
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet # .xlsx
application/msword // .doc
application/vnd.openxmlformats-officedocument.wordprocessingml.document # .docx

参考

HTTP 知新的更多相关文章

  1. [转帖]知新之--12-factors

    知新之--12-factors https://blog.csdn.net/weixin_34233421/article/details/85819756 12-factors I. 基准代码 一份 ...

  2. .net 知新:【3】.net 5 项目结构说明和发布部署

    .net 5的项目目录结构和.net framework有些明显的变化,包括显示结构和项目文件,从这两个方面看看有哪些变化. 项目目录结构 就以上篇用的demo项目为例([.net 知新:[2] .N ...

  3. .net 知新:【4】NuGet简介和使用

    在包管理以前我们在项目中引用第三方包通常是去下载dll放到项目中再引用,后来逐渐发展成各种包管理工具,nuget就是一种工具,适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以 ...

  4. 知新之--12-factors

    作为总的原则,在程序设计上很有高度... 参考URL:http://12factor.net/zh_cn/ ========================================== 12- ...

  5. .net 5+ 知新:【1】 .Net 5 基本概念和开发环境搭建

    最近一两年搞了很多其它事情,.net web方面的基本没做,之前做过几个小的项目零星的学习了些,从.net core 发布后其实都没正真的系统学习过. 就是上手做项目,平时也有关注和看些资料,所以项目 ...

  6. .net 5+ 知新:【2】 .Net Framework 、.Net 、 .NET Standard的概念与区别

    作为了解历史和眼睛或者过程,我们需要将 .Net Framwork ..Net. .Net Stander几个概念进行下理解. .net 代表跨平台框架,从.net 5开始就统一叫.net,废弃原来的 ...

  7. 温故而后知新——对ado.net中常用对象的一些解释

    在使用ado.net连接数据库获取数据,一般的步骤是: 1.设置好web.config    //用来设置服务器数据库的地址以及登录名密码 2.创建Connection对象    //用来创建访问数据 ...

  8. 洗礼灵魂,修炼python(18)--温故加知新

    类型转换: 1.str(),repr(),format():将非字符串数据转换为字符串 str():对象序列化的结果,相当于print输出 repr():程序中某个对象精确值 format():利用特 ...

  9. CSS3 稳固而知新: 居中

    水平居中 transform: translateX(-50%); left: 50%; 垂直居中同理 transform: translateY(-50%);   top:50%;     垂直水平 ...

随机推荐

  1. LeetCode11.盛最多水的容器 JavaScript

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  2. 转载:Python中的if __name__ == '__main__'

    刚开始学习Python时,对于有些书出现的函数带有“if __name__ == '__main__'”总是迷惑不解,比如<dive into Python>中开头的哪个根据输入的数字计算 ...

  3. Java的内存--存储(1)

    有次去面试,面试官突然问我这个问题,当时我只知道怎么写最优化,但是具体不知道为什么那样写,身价立马下降哦 1. 以下开发习惯,你怎么看? for(int i=0;i<2;i++){ Person ...

  4. Django模板简介

    在settings.py中有个TEMPLATES的设置,其中BACKEND用来配置Django模板引擎, DIRS 定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件 一般我们都会把模 ...

  5. poj 2186 Popular Cows :求能被有多少点是能被所有点到达的点 tarjan O(E)

    /** problem: http://poj.org/problem?id=2186 当出度为0的点(可能是缩点后的点)只有一个时就存在被所有牛崇拜的牛 因为如果存在有两个及以上出度为0的点的话,他 ...

  6. Ehcache基于java API实现

    上代码: package com.utils.cacheutils; import com.situopenapi.constant.EhcacheConstants; import com.situ ...

  7. 微信小程序图片上传

    uploadImage : function (){ wx.chooseImage({ count: 9, // 默认9 sizeType: ['original', 'compressed'], / ...

  8. Python全栈day 02

    Python全栈day 02 一.循环语句 while 用法 num = 1 while num <= 10: print(num) num += 1 # 循环打印输出1-10 while el ...

  9. C++拷贝构造函数 的理解

    #include <iostream> using namespace std; //拷贝构造函数的理解 class Point { public: Point(); Point(int ...

  10. PHP环境搭建-记录

    转于 http://jingyan.baidu.com/article/fcb5aff797ec41edaa4a71c4.html php5.5 做了大量的更新,在与apache搭配的时候如何选择也很 ...