网络协议:HTTP

URL

HTTP由URL(统一资源定位符)访问资源,一个完整的URL组成如下:

http://user:passwd@www.x.com:80/index.htm?var1=1&var2=2#frag
这个真没什么好解释的… 更多有关URL的信息请参考RFC1808

URL编码 & 解码

URL中的GET参数和POST内容,除字母数字。 常用编程符号(不含双引)之外,都要Encode处理,空格被转换为+号,+号被转换为%2b
Encode处理过的POST内容,Http头会增加content-type: application/x-www-form-urlencoded,参考Content-Type一节。

HTTP Request

一个完整的请求分请求头消息体两部分:

  • 请求头的每一行都是CRLF结尾,和消息体之间有一个空行分隔开,空行只能是一个CRLF而不能带有空格符。
  • 消息体则是也包括头部和内容. 头包括Allow、Content-Type、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-Type、Expires等等。

Method

HTTP请求共有8种Method,Method是区分大小写的:

  • OPTIONS: 查询服务器支持哪些action。
  • HEAD: 请求服务器返回url对应资源的响应头,并不需要服务器返回响应消息体。
  • GET: 请求url指定的资源。
  • POST: 向url指定的位置增加数据。
  • PUT: 上传/更新资源。
  • DELETE: 删除资源
  • TRACE: 多用于诊断
  • CONNECT: 备用

PUT:client对一个URI发送一个Entity,服务器在这个URI下如果已经又了一个Entity,那么此刻服务器应该替换成client重新提交的,也由此保证了PUT的幂等性。如果服务器之前没有Entity ,那么服务器就应该将client提交的放在这个URI上。
因为服务器在实现POST是不可预知,所以将其定义为不安全、不幂等的Verb。基本上不能方便的归纳为“增删改”之类的行为,都可以使用POST方法。

幂等性

怎么理解HTTP幂等性:
HTTP幂等方法,是指无论调用多少次返回的结果都相同,对资源没有影响。

HTTP GET方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。
HTTP POST方法是一个非幂等方法,因为每次调用都将产生新的资源。
HTTP PUT直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一次影响,但是有相同结果的 HTTP 方法,所以满足幂等性。
HTTP DELETE方法用于删除资源,会将资源删除。调用一次和多次对资源产生影响是相同的,所以也满足幂等性。

Content-type

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • application/xml : XML数据格式
  • application/json : JSON数据格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)

POST提交表单几种常见Content-type

  • application/x-www-form-urlencoded: 格式为k=v&k=v, 并且经过encode
  • multipart/form-data: 多用来上传数据
  • application/json: http的body是json格式

HTTP Response

Code

Response Header第一行是服务器返回的状态码:

  • 200: OK
  • 204: No Content
  • 301: 永久重定向
  • 302: 临时
  • 400: Bad Request,比如缺少参数,语法错误
  • 401: Unauthorized
  • 403: Forbidden
  • 404: Not Found
  • 500: Internal Server Error 服务器内部错误
  • 502: Bad Gateway 后端服务返回给网关无效响应
  • 503: Service Unavailable 后端服务由于维护或者过载,积极拒绝服务
  • 504: Gateway Timeout 代理从后端服务器获取超时

[[../31.Backend/反向代理-Nginx#Nginx返回502 503 504]]

Http Request和Response的一些常用参数

Content-Type:

常见的Content-Type:

  • text/html
  • text/plain
  • text/css
  • text/javascript
  • application/x-www-form-urlencoded: 常用的表单发包方式,POST内容做了URLEncode处理会自动加上这个参数
  • multipart/form-data
  • application/json
  • application/xml

Cache-Control:

Location:

用于将客户端重定向一个新的地址,一般和302状态值相关。

Content-Length:

指定response的长度,如果一个response太大服务器无法确定其长度,服务器会在response头部插入一个 Transfer-Encoding: chunked字段,表示需要分块传输. 这个response的消息体包括数个chunk,每个chunk都由本chunk字节数+CRLF + 本chunk内容+CRLF组成,最后会带一个长度为0的chunk表示结束。

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

25
This is the data in the first chunk
1A
and this is the second one
0

HTTPS

HTTPS的端口是443,HTTP的端口是80,二者的区别还在于HTTPS是在普通HTTP和TCP之间插入了一个SSL(Secure SocketLaye,基于非对称/对称加密算法的协议)。

SSL

SSL使用了RSA非对称加密,SSL握手过程:

  • 客户端发出请求,服务端发送给客户端证书和公钥;
  • 客户端先验证服务端的证书有效性,然后随机生成预备密码(pre-master secret),用公钥加密发给服务器;
  • 服务器用私钥解密出预备密码,然后双方用预备密码商议出主密码(master secret),SSL握手结束;
  • 之后C/S端使用主密码做对称加密传输数据。

SSL的证书

SSL证书由CA(“证书中心”certificate authority)颁发,CA将网站的的公钥,用CA的私钥加密,生成为数字证书(Digital Certificate). 也就是说网站的数字证书里是含有网站的公钥的,客户端可以从CA处请求验证这个证书是否正确。
@ref: 阮一峰:数字签名是什么?

Restful

符合Restful风格

Java对Restful的支持

Restful框架