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. data-ng-click 指令

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. Docker官方文档翻译1

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80098675 本文出自方志朋的博客 本系列教程翻译于docker文档,文档地址:http ...

  3. js日期相减得到分钟数

    const date1 = new Date(fieldsValue.examStartTime); const date2 = new Date(fieldsValue.examEndTime); ...

  4. #leetcode刷题之路26-删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1: ...

  5. Sql Server 查看存储过程最后修改时间

    Sql Server 查看存储过程最后修改时间 select * from sys.procedures order by modify_date desc

  6. sudo及visudo

    sudo是一种权限管理机制,管理员可以授权普通用户去执行root的操作,而不需要知道root的密码,它依赖于/etc/sudoers这个文件,可以授权给哪个用户在哪个主机上能够以管理员的身份执行什么样 ...

  7. 吐血分享:QQ群霸屏技术教程2017(维护篇)

    排名上去,并不是终极稳定,日常维护相当重要. 群排名做上去了,如果不去维护,排名很可能会下去,尤其是咱们做了很多群的时候,完全不会留意到. 为什么不稳定? 1.活跃度下去了,排名当然不稳定,这个需要日 ...

  8. ECSHOP快递单号查询插件圆通V8.2专版

    本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅急送快递.德邦物流.百世快递.汇通快递.中通快递.天天快递等知 ...

  9. Python学习手册之Python介绍、基本语法(二)

    在上一篇文章中,我们介绍了Python的一些基本语法,现在我们继续介绍剩下的Python基本语法.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/987193 ...

  10. 分享一个工作中遇得到的sql(按每天每人统计拖车次数与小修次数)

    查询每人每天的数据 首先先建表 CREATE TABLE `user` ( `name` ) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CR ...