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. android(eclipse)广播机制知识梳理(三)

    1:分类:   标准广播:没有先后顺序,无法被截断   有序广播:又先后顺序,可以截断 2:接收广播:首先进行注册,注册的方式有静态注册和动态注册.也就是在代码中注册和在AndroidManifest ...

  2. mysql慢查询开启及分析方法

    最近服务维护的公司的DB服务器,总是会出现问题,感觉需要优化一下了,登陆上去,发现慢查询日志都没有开,真是惭愧, 故果断加上慢查询日志, 经过分析sql记录,发现问题很多,开发人员很多没有对sql优化 ...

  3. C#中rpt的数据类型和Oracle中数据类型的匹配

    Oracle中number数据类型对应C#中decimal数据类型,结果是整数 Oracle中number数据类型对应C#中int32数据类型,结果是小数,保留两位小数 Oracle中中date类型数 ...

  4. Xcode 新建js文件

    Xcode 新建js文件

  5. leetcode笔记(六)740. Delete and Earn

    题目描述 Given an array nums of integers, you can perform operations on the array. In each operation, yo ...

  6. Python的核心数据类型

    ​ Python的核心数据类型有:数字,字符串,列表,字典,元组,文件等. 数字 ​ 数字类型有:整形int,浮点型float,复数complex,布尔型bool. 整形 ​ 整型数是不带有小数部分的 ...

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

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

  8. java中的基本算法

    整理一下常用的又基础的算法.由于平时的项目比较简单,很少用到算法,但工作不只是眼前的苟且,还有诗和远方. 1.链表 链表用来存储数据,由一系列的结点组成.这些结点的物理地址不一定是连续的,即可能连续, ...

  9. hibernate笔记1

    1.  数据库中的表关系 一对一.一对多(多对一).多对一 2.  如何确立表中的表关系 一对多的关系如何实现:使用外键约束,一的方称为主表,多的方称为从表. 外键:从表中有一列,该列的取值除了nul ...

  10. Java OOP——第四章 异常

    1. 接口:接口就是给出一些没有内容的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来. 接口是更加抽象的抽象的类, 抽象类里的方法可以有方法体, 接口里的所有方法都没有方法体. ...