HTTP 知新
REST
先从 REST 的角度来看看 HTTP 协议规范,
- URL:需要操作的对象,也就是资源
- HTTP method:我要对该对象做什么(POST 增、DELETE 删、GET 查、PUT 和 PATCH 改)
- HTTP status code:操作的结果
HTTP 方法
HTTP 方法有五个值得注意的性质。
- 前两个属性分别指示该方法的请求和响应是否应该有主体。这个比较重要,因为它涉及到了参数的传递方式。比如 GET 方法就不应该含有主体,因此 GET 方法的参数就只能编码在 url 中。
- 中间三个属性——安全、幂等和可缓存,定义在 RFC7231 中。
- 安全:如果一个方法的语义在本质上是「只读」的,那么这个方法就是安全的。
客户端向服务端的资源发起的请求如果使用了是安全的方法,就不应该引起服务端任何的状态变化,因此也是无害的。
此RFC定义,GET, HEAD, OPTIONS 和 TRACE 这几个方法是安全的。 - 幂等(Idempotent):幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同。
按照RFC规范,PUT,DELETE和安全方法都是幂等的。 - 可缓存:方法是否可以被缓存。。
- 安全:如果一个方法的语义在本质上是「只读」的,那么这个方法就是安全的。
- 该方法是否被表单支持:表单只支持 POST 与 GET
在使用 HTTP 时,我们应当遵循这五个属性。
GET
:请求指定的资源,它的参数用于过滤。使用GET
的请求应该只用于获取数据。
请求是否有主体 | 否 |
成功的响应是否有主体 | 是 |
安全 | 是 |
幂等 | 是 |
可缓存 | 是 |
HTML 表单是否支持该方法 | 是 |
POST
:新增资源。请求主体的类型由 Content-Type 首部指定。
POST
不是幂等的,调用多次可能导致新增多个资源!
请求是否有主体 | 是 |
成功的响应是否有主体 | 是 |
安全 | 否 |
幂等 | 否 |
可缓存 | 某些情况下可以 |
HTML 表单是否支持该方法 | 是 |
PUT
:更换指定的资源。
PUT
与POST
方法的区别在于,PUT
方法是幂等的,即调用多次与调用一次是等价的。
请求是否有主体 | 是 |
成功的响应是否有主体 | 否 |
安全 | 否 |
幂等 | 是 |
可缓存 | 否 |
HTML 表单是否支持该方法 | 否 |
DELETE
:删除指定的资源
请求是否有主体 | 可以有 |
成功的响应是否有主体 | 可以有 |
安全 | 否 |
幂等 | 是 |
可缓存 | 否 |
HTML 表单是否支持该方法 | 否 |
PATCH
:部分修改指定的资源
请求是否有主体 | 是 |
成功的响应是否有主体 | 否 |
安全 | 否 |
幂等 | 否 |
可缓存 | 否 |
HTML 表单是否支持该方法 | 否 |
REST API 将 url 看作资源,上述五个方法就是对资源的增删查改。
响应码则表示处理结果,可参考 Github API - v3 和 PayPal API
HTTP 中的数据
请求中的数据
HTTP 请求中,数据可以放在下列几个地方:
- url 参数:一般只用于添加资源过滤条件。(就像 SQL 的过滤条件一样)
- cookie:一般只用于保存 session 信息
- 主体:一般不是表单数据,就是二进制数据。通过
Content-Type
指示主体的 MIME 类型。
MIME 类型就相当于文件的拓展名,在 Web 世界通常都用 MIME 来指示文件的性质和格式。
表单是最常用的数据 POST 方式,也可以考虑使用 json。
表单编码类型
在 html 中,表单的编码方式通过 form 元素的 enctype
(encode type)指定,
- 默认是
application/x-www-form-urlencoded
(requests 也是如此),即表单使用urlencode
编码,然后放到主体中。(而不是 url 中) - 在表单中包含二进制文件时,就必须手动指定
enctype="multipart/form-data"
,使用多部分表单编码!否则二进制文件不会被传输。- 这是因为
application/x-www-form-urlencoded
使用&
做参数分隔,它无法编码二进制文件。
- 这是因为
而对非表单数据,将 Content-Type 设置为对应的 MIME 类型就行。
响应中的数据
服务器返回数据的手段有:
- 用
Set-Cookie
设置 cookie,而且Set-Cookie
字段可以重复,以设置多个 cookie. - 主体,并使用 Content-Type 指示主体类型。
对 REST API 而言,响应最常用的 MIME 应该是 application/json
.
疑问:响应是否也能用表单形式呢?
首先分析一下如果响应可以用表单,有什么好处:
- 一般的参数直接用 json 返回就行,因此
application/x-www-form-urlencoded
没什么用。 - 而如果需要同时返回二进制和别的参数,一般的方法是使用 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 知新的更多相关文章
- [转帖]知新之--12-factors
知新之--12-factors https://blog.csdn.net/weixin_34233421/article/details/85819756 12-factors I. 基准代码 一份 ...
- .net 知新:【3】.net 5 项目结构说明和发布部署
.net 5的项目目录结构和.net framework有些明显的变化,包括显示结构和项目文件,从这两个方面看看有哪些变化. 项目目录结构 就以上篇用的demo项目为例([.net 知新:[2] .N ...
- .net 知新:【4】NuGet简介和使用
在包管理以前我们在项目中引用第三方包通常是去下载dll放到项目中再引用,后来逐渐发展成各种包管理工具,nuget就是一种工具,适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以 ...
- 知新之--12-factors
作为总的原则,在程序设计上很有高度... 参考URL:http://12factor.net/zh_cn/ ========================================== 12- ...
- .net 5+ 知新:【1】 .Net 5 基本概念和开发环境搭建
最近一两年搞了很多其它事情,.net web方面的基本没做,之前做过几个小的项目零星的学习了些,从.net core 发布后其实都没正真的系统学习过. 就是上手做项目,平时也有关注和看些资料,所以项目 ...
- .net 5+ 知新:【2】 .Net Framework 、.Net 、 .NET Standard的概念与区别
作为了解历史和眼睛或者过程,我们需要将 .Net Framwork ..Net. .Net Stander几个概念进行下理解. .net 代表跨平台框架,从.net 5开始就统一叫.net,废弃原来的 ...
- 温故而后知新——对ado.net中常用对象的一些解释
在使用ado.net连接数据库获取数据,一般的步骤是: 1.设置好web.config //用来设置服务器数据库的地址以及登录名密码 2.创建Connection对象 //用来创建访问数据 ...
- 洗礼灵魂,修炼python(18)--温故加知新
类型转换: 1.str(),repr(),format():将非字符串数据转换为字符串 str():对象序列化的结果,相当于print输出 repr():程序中某个对象精确值 format():利用特 ...
- CSS3 稳固而知新: 居中
水平居中 transform: translateX(-50%); left: 50%; 垂直居中同理 transform: translateY(-50%); top:50%; 垂直水平 ...
随机推荐
- 全文搜索引擎 Elasticsearch 安装踩坑记录
一.安装 Elastic 需要 Java 8 环境.如果你的机器还没安装 Java 安装完 Java,就可以跟着官方文档安装 Elastic.直接下载压缩包比较简单. $ wget https://a ...
- html加载顺序以及影响页面二次渲染额的因素
浏览器请求发往服务器以后,返回HTML页面,页面内容开始渲染,具体的执行顺序为: 1. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文 ...
- 洛谷P3871 [TJOI2010]中位数(splay)
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- 2019年第十届蓝桥杯c++A组java/c++组题解
#include<iostream> #include<vector> using namespace std; vector <int > vec; long l ...
- webpack 之 webpack-dev-server自动刷新
watch 首先介绍watch选项,参考这里.可实现相关源文件改变后自动更新bundle.js文件的功能.在配置文件中添加 watch:true 或执行 webpack -w,即可开启watch功能: ...
- SSM框架理解搭建(虽然是网上拼的,但是实际按照搭建是可以的)——
SpringSpring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象.Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地 ...
- Linux之MariaDB
MariaDB数据库的起源 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜 ...
- ruby 操作csv
1.读取csv 文件中读取:一次读入全部(设置headers使 CSV#shift() 以CSV::Row对象返回而不是数组:使 CSV#read() 返回 CSV::Table 对象而不是数 ...
- Linux命令备忘录:mount用于加载文件系统到指定的加载点
mount命令用于加载文件系统到指定的加载点.此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命 ...
- go 操作数据库
假设有了数据库,创建表 CREATE TABLE `userinfo` ( `uid` INT(10) NOT NULL AUTO_INCREMENT, //自增字段 `username` VARCH ...