http报文包括:request报文和response报文;每个request和respose构成一次事务;每个报文由三部分构成:起始行start line,首部header和主体data body。
常见请求类型
- get:获得/查询某个资源,应该是安全和幂等的;
- head:获取报文head,与get方法一样,但是不返回报文主体,通常用于确认url的有效性或者确认资源更新的日期时间;
- post:向服务器传输数据,通常用来支持html的表单;
- put:写入文档,类似于insert;
- delete:删除资源
- options:询问支持的方法
返回类型
- 1XX: 信息状态码,很少用到;
- 2XX: 成功
- 3XX: 重定向状态码,资源被移动,一般附带Location首部,告知request新的位置;
- 301 Move Permanently永久性重定向
- 302 Found临时性重定向
- 304 not Modified资源没有修改,client可以在cache中获取;
- 4XX: 客户端错误状态码
- 400 bad Request报文语法错误
- 403 Forbidden访问被服务器拒绝
- 404 Not Found
- 5XX: 服务器本身发生错误
- 500 Internal Server Error
- 502 Bad Gateway 服务器遇到了上游的无效响应
- 503 Service Univailable 服务器暂时无法处理请求
curl命令
- curl处理get请求curl “http://www.baidu.com“ 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地
- curl -i “http://www.baidu.com“ 显示全部信息
- curl -l “http://www.baidu.com“ 只显示头部信息
- curl -v “http://www.baidu.com“ 显示get请求全过程解析
- wget “http://www.baidu.com"也可以
- curl -d “param1=value1¶m2=value2” “http://www.baidu.com“ curl处理post请求
- curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html 将文件下载到本地并命名为mygettext.html
- curl -O http://www.gnu.org/software/gettext/manual/gettext.html 将文件保存到本地并命名为gettext.html
- curl -D sugarcookies http://localhost/sugarcrm/index.php 将网站的cookies信息保存到sugarcookies文件中
- curl -b sugarcookies http://localhost/sugarcrm/index.php 使用上次保存的cookie信息
curl提供了一个简单的方法来完全控制传出HTTP请求的HTTP头。你需要的这个参数是“-H” 或者 “–header”。
Cookie&Session
cookie和session都是用来解决http无状态的问题,可以记录用户的状态和个性化信息,实现持久化会话。
cookie存在client端,session存在服务端;
session会消耗server内存,不支持分布式,一般使用cookie;
cookie属性
- String name;//cookie的名字,同一域下必须唯一
- String value;//cookie的值,敏感信息不能穿明文
- String domain;//cookie的作用域,不能跨域
- int maxAge = -1;//默认有效期,只存在本次会话
- String path;//作用的context,包括当前context以及其子context
- boolean secure;//是否安全传输,如果为true的话,则只有在https时
才发送cookie
持久连接
http事务结束之后,不会直接将其关闭,因为每次简历连接和启动连接时候都比较耗时,所以会keep-alive;
- tcp slow start:tcp在启动时,会限制连接的最大速度,数据传输成功后随着时间而提高传输速度;
- Keep-alive:在http事务结束后任然保持tcp连接打开状态,为后续事务重复利用,直到client和server关闭;keep-alive随request一起发送,如果某一次request没有带,服务器会在response之后关闭连接,response的keep-alive有两个参数:可保持最大连接数max和可保持最大时长timeout;
- 代理Proxy: 位于client和cerver之间,对request和respose进行转发、包装或修改,例如nginx
- 哑代理问题: 代理对请求直接转发,不进行处理,导致客户端传递的Proxy-connection无法被服务器端识别,从而服务器在返回信息时不带connection:keep-alive的头部;而崇明的代理会在代理层做解析,把Proxy-connection转化成服务器可以识别的connection:keep-alive;详细过程可以参考用暴走漫画理解HTTP-探探持久连接