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. autofac 注册

    1 注册的概念和方式 使用autofac 的ContainerBuilder 来注册组件(components---通常指实现类),并把它的服务(service---通常指接口,抽象类,类实例)暴露给 ...

  2. LeetCode3.无重复字符的最长子串 JavaScript

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  3. ABAP术语-Purchase Order

    Purchase Order 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/07/1094717.html Request or instr ...

  4. ABAP术语-Business Object

    Business Object 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/07/1028364.html Represents a ce ...

  5. 配置django控制台输出ORM转化的sql

    在setting中配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ ' ...

  6. 台式机上如何配置并使用苹果iPhone的耳机麦克风 并且麦克风开启降噪功能

    这个资料和技巧在网络上面很少有人分享,但是可能会有不少人需要这个东西.这里分享下经验.这也是一个困扰我很久的一个问题.因为买来了这个转接头,发现,录音的时候iPhone的耳机麦克风有很大的噪音无法消除 ...

  7. javaScript 字符串与unicode码之间的相互转换,函数的封装

    在我们的开发过程中,有时在对数据进行储存的时候,我们需要将字符串转成unicode. 比如,在jsp开发时,前端使用页面间传值时,将传值参数先存入cookie中,然后在使用的时候,再从ookie中取出 ...

  8. 在Vue项目里面使用d3.js

    之前写一个 Demo里面 有些东西要使用d3实现一些效果 但是在很多论坛找资源都找不到可以在Vue里面使用D3.js的方法,npm 上面的D3相对来说 可以说是很不人性化了 完全没有说 在webpac ...

  9. sencha inspector(调试工具)

    Sencha Inspector 一:安装sencha inspector 使用Sencha Inspector下载Ext JS试用版(可在此处获得). 下载后,双击下载的文件以启动安装程序,然后按照 ...

  10. jquery之prop与attr区别。

    一切看下面代码示例<!DOCTYPE html> <html> <head> <title>全选和反选</title> <script ...