HTTP协议
1.定义:规范 浏览器和服务器之间 传输格式
b() ---- s(web服务软件)
对浏览器客户端与服务器的数据传输格式规范。
2.一个请求,有且只有一个响应
Request , Response
服务器读取请求,解析请求。
浏览器(B)请求的时候,有很多种浏览器,火狐,IE,谷歌等,
请求到服务器的时候。
服务器给浏览器提要求,要求,不同浏览器发送的请求数据格式必须一致!
服务器解析之后,返回给浏览器的数据也要一定的规范。因为服务器也有不同的。
就需要一个协议,出现了HTTP协议。
3.浏览器也是一个socket客户端。
C --- S 之间的传输是用的socket技术。( )
socket是基于tcp/ip协议,数据的传输完整性较高,三次握手。udp和tcp/ip对应,udp很快,不会经过数据连接,直接把数据发送,接不接是你的事情。tcp/ip协议关注的是客户端与服务器端数据传输是否成功,没有成功还会重新发送。
tcp/ip协议:是数据传输的底层协议。
http协议:是在tcp/ip协议之上封装的一层协议。关注的是数据传输的规范。
浏览器和服务器之间的通信,说白了就是客户端与服务器端的通信。
4.抓包。
查看HTTP协议的工具:
火狐浏览器的firebug
谷歌就是审查元素
Telnet:默认情况是不开启的。需要在打开或关闭
windows功能里面打开Telnet客户端.
telnet 主机名 端口号
![{E~JJL5L$P]R``5G_E_JQ42.png](http:https://img.haomeiwen.com/i1197462/20aa69db3834e885.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5.http协议的内容
Request:
Host: cdn-accounts.firefox.com.cn
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/css,/;q=0.1
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://accounts.firefox.com.cn/
Origin: https://accounts.firefox.com.cn
Connection: keep-alive
Response:
Access-Control-Allow-Origin: https://accounts.firefox.com.cn
Age: 79293
Cache-Control: max-age=86400
Content-Encoding: gzip
Content-Length: 10956
Content-Type: text/css
Date: Thu, 25 Aug 2016 04:23:58 GMT
EagleId: b68cee4a14721783318278291e
Expires: Fri, 26 Aug 2016 04:23:58 GMT
Last-Modified: Thu, 18 Aug 2016 02:56:57 GMT
Server: Tengine
Timing-Allow-Origin: *
Vary: Accept-Encoding
Via: cache1.l2eu6[0,304-0,H], cache3.l2eu6[0,0], kunlun10.cn172[0,200-0,H], kunlun10.cn172[0,0]
X-Cache: HIT TCP_MEM_HIT dirn:11:499525583
X-Firefox-Spdy: h2
X-Swift-CacheTime: 86400
X-Swift-SaveTime: Thu, 25 Aug 2016 04:24:45 GMT
【格式是固定的】
请求行 (注意,三个之间都有空格):GET /day09/hello HTTP/1.1
请求头(多个key-value对象):Host:localhost:8080
一个空行
(可选的)实体内容:name=eric&password=123456
---解释
a.请求行:(GET /day09/hello HTTP/1.1)
http协议的版本:http1.0 当浏览器你客户端与服务器端简历连接之后,只能发送一次请求,一次请求之后关闭连接。要发送第二次请求需要再建立连接。
http1.1 当浏览器与服务器建立练级而之后,可以发送多次请求。现在浏览器基本都用1.1的,效率高点。
*问题:当一个web页面的3个<img>标签嵌入了三张不同的图片的链接,打开这个页面,发送了几次请求。
答案:4次。请求html一次,3次img标签。
只要寻找另外的资源,就会发送一次请求。
如果3张图片有2张一样的,那么就是虽然发送了4次,但是浏览器有缓存的功能,就拦截了请求,在抓包上面也只能看到3次。
请求资源:
URL:统一资源定位符。http://www.baidu.com 是URI的子集。
URI :统一资源标记符。 /day09/hello 用于标记任何资源。可以是本地文件资源,也可以是局域网重的资源,也可以是互联网上的资源。
请求方式:
请求方式:GET POST PUT HEAD DELETE TRACE CONNECT OPTIONS
常用的只有2个:GET POST
get 和 post 常用在表单的提交。
表单提交:
<form action="提交地址" method="GET/POST">
</form>
>GET vs POST
1)get
以?开头,多个参数之间用&连接。放在Url的后面。
get提交的数据有限制,不超过100kb
2)post
post请求提交的参数,是放在post请求头的空行,空行之后的。是跟在请求的实体内容之中。
多个参数之间是以&连接。
post提交没有限制,或者说限制的数据两会很大。Post方式提交敏感数据。
请求参数,get是放在请求行的URI中,post是放在请求体之后。
b.请求头:
请求头有多个,
Accept:text/html,image/* 接受html,image(*代表各种,gif,png,jpeg都可以) --- 浏览器可以接受的数据类型。
Accept-Charset:ISO-8859-1 --- 浏览器可以接受的编码格式
Accept-Encoding:gzip,compress --- 浏览器接受的数据压缩格式
Accept-Language:en-us,zh- ---浏览器接受的语言。
Host:www.it356.org:80 ---(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since:Tue,11 Jul 2000 18:3:::51 GMT --- 浏览器最后的缓存时间
Refere:http://www.it315.org/index.jsp --- 当前请求来自于哪儿
User-Agent:Mozilla/4.0(compatible;MSIE 5.5; Windows NT5.0) --- 浏览器类型
Cookie:name=eric --- 浏览器保存的cookie信息
Connection:close/Keep-Alive --- 浏览器跟服务器连接状态。 close:连接关闭 keep-alive:连接保持
Date:Tue,11 Jul 2000 18:23:51 GMT --- 请求时间
*注意:
所有的请求信息都封装在了HttpServletRequest对象中。servlet:伺服小程序,小服务程序。
这个对象是服务器封装的。
tomcat第二部是调用doGet方法,然后把request对象传入到servlet中。
浏览器直接访问一个资源,默认的请求方式就是get方式。
request.getHeader("Host"); // 拿到请求通的Host
request.getHeaderNames(); // 得到所有请求头的名称。
Enumeration<String> enums = request.getHeaderNames();
While(enums.hasMoreElements()){
String headerName = enums.nextElement(); // 去除下一个元素
}
request.getInputStream(); // 得到实体内容
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf)) != -1){
String str = new String(buf, 0, len);
System.out.println(str);
}
GET请求是没有实体内容的。
// doPost 是可以得到Post请求的请求参数
public void doPost(HttpServletRequest request, HttpServletResponse response){
}
c.实体内容
只有post请求才能放到实体内容里面
核心API:
请求行:
request.getMethod(); // 方式
request.getRequestURI(); / request.getRequestURL();
request.getProtocol(); 请求协议
请求头:
request.getHeader("名称");
实体内容:
request.getInputStream(); // 获取实体内容数据