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. caffe+opencv3.3.1

    跟着时代走 换成opencv3.3.1,目前来看所有的都是最新版了. anaconda最新,opencv最新,我看了protobuf也很新. 下次再买台服务器时,我想直接用python来弄,因为这次安 ...

  2. .length()与.length与.size()

    .length  .length()属于数组的一个属性和string的一个方法,可以获得该数组或者字符串的长度,返回一个整型数据 .size()属于List泛型对象的一个方法,返回一个list对象中存 ...

  3. 一款查询天气的WebApp

    一.WebApp介绍 1.初始界面 2.搜索结果页面 二.项目代码 1.项目目录 --------app ----------app.component.ts ----------app.compon ...

  4. 菜鸟笔记 -- Chapter 6.2 类的构成

    在前面我们讲过高级开发语言大多由7种语法构成,但这是一个很空泛的概述,下,面我们仅就针对Java程序来说一下构成一个Java程序的几大部分,其中类是最小的基本元素.类是封装对象属性和行为的载体,而在J ...

  5. python使用sqlalchemy连接mysql数据库

    环境:centos7+python2.7.5+sqlalchemy sqlalchemy是python当中比较出名的orm程序.在python中,使用sqlalchemy连接mysql数据库进行操作非 ...

  6. Javascript中的内存泄漏

    最新博客站点:欢迎来访 一.内存泄漏        由于某些原因不再需要的内存没有被操作系统或则空闲内存池回收.编程语言中有多种管理内存的方式.这些方式从不同程度上会减少内存泄漏的几率,高级语言嵌入了 ...

  7. 【MYSQL笔记3】MYSQL过程式数据库对象之存储过程的调用、删除和修改

    mysql从5.0版本开始支持存储过程.存储函数.触发器和事件功能的实现. 我们以一本书中的例题为例:创建xscj数据库的存储过程,判断两个输入的参数哪个更大.并调用该存储过程. (1)调用 首先,创 ...

  8. 大数据开发从入门小白到删库跑路(一)- 获取Hadoop

    Hadoop是一个可以通过相对简单编程模型实现跨多台计算机集群分布式处理大型数据集的框架.它不是依赖于高额成本的硬件可靠性来提供高可用性,Hadoop的设计能从单个服务器扩展到数千台机器,每个机器提供 ...

  9. Win7下如何安装python pygame的whl包

    看了小甲鱼的python教程,对那个python版本的打飞机游戏很感兴趣,尝试运行,居然报错了,提示缺少pygame包: 仔细一看需要安装一个pygame的包,默认安装好python是不包括这个包的, ...

  10. Yii2.0 游客访问限制(转)

    最近在用Yii2.0做项目,其中需要实现一个功能:没有登录不能访问部分页面,即游客身份访问限制.查了半天资料,终于找到答案.解决方法如下: 在access里,access即访问的意思,其中有个配置项 ...