HTTP协议请求(request)(上)

422 阅读8分钟

http&request

第一章 HTTP协议

我们平常上网都应该完成过登录的过程,那么,浏览器是如何将用户名和密码传送给服务器的?浏览器发送数据是随意发送的吗?其实浏览器和服务器通信是按照一定格式进行交互的。这就是协议!我们浏览器和服务器是按照HTTP协议进行数据交互的,HTTP协议分为请求协议和响应协议,通信就是一次请求,一次响应。

什么是协议:网络通信中,数据以固定的格式传输数据. HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

简而言之:浏览器和服务器数据交换固定的格式。

请求协议:浏览器将数据以请求格式发送到服务器。

响应协议:服务器将数据以响应格式返回给浏览器。

以下是我们平时登录网站的过程分析,根据登录过程我们引出今日的知识点。

1、什么是HTTP协议

HTTP协议,全称"超文本传输协议(HyperText Transfer Protocol)"是互联网上应用最为广泛的一种网络协议。简而言之,就是一种在web中传输数据的格式。

注意:我们之前学习过TCP协议。Socket类是TCP协议。HttpServletRequest接口使用的HTTP协议。

HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。 
所有的WWW文件(客户机/服务器网络)都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
1960年美国人TedNelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。
Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC(一系列以编号排定的文件),其中著名的RFC 2616定义了HTTP 1.1
协议版本:
- [x] HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
- [x] HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。

2、HTTP协议的特点

1. 基于请求/响应模型的协议。请求和响应必须成对,先有请求后有响应。

浏览器是通过请求协议将数据传递到服务器,浏览器访问服务器几种方式: (了解一下),其中掌握的就是get和post方式,下面我们使用浏览器抓包工具来分析get和post请求有何不同。

请求方式请求说明
OPTIONS返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息
GET向特定的资源发出请求(a href="servlet"标签/js location.href="servlet",在浏览器输入网址)
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建或已有资源的修改
PUT向指定资源位置上传其最新内容
DELETE请求服务器删除Request-URI所标识的资源
TRACE回显服务器收到的请求,主要用于测试或诊断
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

虽然HTTP的请求方式有8种,但是我们在实际应用中常用的也就是get和post

重点掌握:get/post

3、HTTP协议的结构

HTTP协议的结构包括两部分:请求报文,响应报文;

  1. 请求报文:浏览器给服务器发送的请求数据的格式。请求报文主要包括:请求行请求头请求体
  2. 响应报文:服务器给客户端(浏览器)响应的数据格式。响应报文主要包括:响应行响应头响应体

4、浏览器抓包观察请求报文

浏览器可以抓取请求的数据,但是现在的浏览器都对请求的参数在格式上进行了优化。如果想要看到原始的请求报文,需要使用到工具。本次课程使用chrome这个工具对请求数据进行抓取分析。

4.1、抓包方法:

4.1.1、在idea中创建html文件

【request01.html文件】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body><h2>GET请求</h2>
    <form action="/getServlet" method="get">
        用户名:<input type="text" name="username" value="zhangsan" /><br>
        密码:<input type="text" name="pwd" value="123" /><br>
        <input type="submit" value="提交"/>
    </form>
​
​
<h2>POST请求</h2>
    <form action="/postServlet" method="post">
        用户名:<input type="text" name="username" value="zhangsan"/><br>
        密码:<input type="text" name="pwd" value="123"/><br>
        <input type="submit" value="提交"/>
    </form></body>
</html>
4.1.2、在idea中创建Servlet

GetServlet代码如下:

@WebServlet("/getServlet")
public class GetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
​
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
    }
}

PostServlet代码如下:

@WebServlet("/postServlet")
public class PostServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
​
    }
}
4.1.3、启动Tomcat服务器,打开Chrome 浏览器访问request01.html页面

【页面显示效果】

get和post请求抓包.bmp

点击GET请求提交按钮,然后按下快捷键F12

抓取到的请求信息.bmp

点击POST请求提交按钮,然后按下快捷键F12

抓取到的请求信息2.bmp

说明:post请求,我们发现表单中的数据没有存在于url后面。

4.1.4、 分别以get和post方式提交表单并抓取数据
【GET请求】请求报文

请求行:

1537240287221.png

请求头:

1537240356621.png

请求体:

get请求,请求体为空。

【GET请求抓取包的内容】

【请求行】
Request URL: http://localhost:8080/getServlet?username=lisi&password=1234
Request Method: GET
【请求头】
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: keep-alive
Cookie: Idea-b448aa5d=cd5f4ed8-f3f1-4815-82c0-776f9477ca73; life=lifetime; JSESSIONID=4138D7A0EAAB9788E9AD01900F064832
Host: localhost:8080
Referer: http://localhost:8080/demo01.html
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

【请求体】

【POST请求】请求报文

请求行:

1537240441817.png

请求头:

1537240475885.png

请求体:

image.png

【POST请求抓取包的内容】

【请求行】
Request URL: http://localhost:8080/postServlet
Request Method: POST
【请求头】
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 27
Content-Type: application/x-www-form-urlencoded
Cookie: Idea-b448aa5d=cd5f4ed8-f3f1-4815-82c0-776f9477ca73; life=lifetime; JSESSIONID=4138D7A0EAAB9788E9AD01900F064832
Host: localhost:8080
Origin: http://localhost:8080
Referer: http://localhost:8080/demo01.html
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

【请求体】
username: lisi
password: 1234
4.1.5、请求报文分析
【请求行】

请求行位于请求报文的第一行,由:url 请求方式 协议/版本 组成

Request URL: http://localhost:8080/postServlet
Request Method: POST

由于浏览器的原因我们看不到请求协议和版本。

【请求头】

位于请求行的下面,以键值对 的形式给服务器传递信息,有些请求头信息是非必须的。

Host: localhost:63342
Connection: keep-aliv
Content-Length: 25
Cookie: JSESSIONID=AEE81E76BF586D353D84886D9B5E0BFD;
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36

【常用的请求头】:

请求头示例说明
User-AgentUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)浏览器携带的用户操作系统,浏览器版本等信息
【请求体】

get请求请求体为空;post请求的请求体传递请求参数

刚才通过抓包看到post请求体中数据

username: lisi
password: 1234

5、HTTP协议小结

1. HTTP:超文本传输协议,定义了浏览器与服务器之间数据传输的格式;
2. HTTP协议组成:
    1. 请求报文:请求行,请求头,请求体;
         1. 请求行:请求报文中的第一行数据,包括**请求方式****URL****协议/版本** ;
         2. 请求头:以键值对的数据格式,给服务器传输数据。常用的请求头:user-agent,cookie;
         3. 请求体:get请求:有请求体,但是没有内容;post请求:请求体传递请求参数;
    2. 响应报文:响应行,响应头,响应体;

GET和POST请求区别

1. GET请求:
    1)请求行直接传递请求参数.将请求参数追加在URL后面,不安全。例如:form.html?username=jack&username=1234
    补充:但是get请求可以作为商品的分享。
    2)URL长度限制(不同浏览器限制大小不一致),GET请求方式的数据大小,不可以传输数据量较大或者非文本数据。例如图片或者视频。
    3)请求体里面没有内容。
​
2.  POST请求:
    1)请求参数以请求体形式发送给服务器,数据传输安全。
    2)请求数据可以为非文本数据,可以传输数据量较大的数据。
    3)只有表单设置为method=”post”才是post请求.
    其他的都是get请求。常见GET请求:地址栏直接访问、<a href=””>、<img src=””> 等

浏览器和服务器是以固定的格式进行通信的,采取的HTTP协议的请求协议。浏览器通过请求协议,将数据传送到服务器中。