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风格
- URI中只有名词, 表示资源
- 动词不应该出现在URI中, 而使用HTTP协议里的
GET, POST, DELETE, PUT
对应查询, 新增, 删除, 更新; - 接口返回JSON, 或者XML
- 返回Code用HTTP状态表示
- 为什么要采用RESTful架构?·tianlu1677/filemanagerWiki·GitHub
Java对Restful的支持
- 用Java技术创建RESTfulWeb服务(JAX-RS):https://www.ibm.com/developerworks/cn/web/wa-jaxrs/
Restful框架
- Jersey, Restx …
- 使用Jersey创建RESTful WebService: http://www.importnew.com/7336.html