【计算机网络】《HTTP协议方法GET和POST的比较》

题目:《HTTP协议方法GET和POST的比较》姓名:高德博日期:2022.9.28

实验环境:

  • JDK1.8
  • IDEA2021
  • Edge浏览器

目录

1.认识HTTP

HTTP协议(Hypertext Transfer Protocol)是超文本传输协议的简称,是应用层一个基于请求/响应的模式的无状态协议

目前,HTTP常用的版本是1.1
相比于1.0版本,1.1实现了长连接——浏览器可以连续发送多次请求,不必等待每次响应之后再请求

2.报文

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iwlXr14o-1664364310882)(imgs/Pasted%20image%2020220926211738.png)]

  • 报文首部

      • 请求行
        Method Request-URI HTTP-Version CRLF
        请求行以一个CRLF结束

      • 响应行

    • 首部字段

      • 通用首部字段
      • 请求首部字段
      • 响应首部字段
      • 实体首部字段
  • 空行

CRLF用于分隔报文首部和报文主体(两个,第一个表示首部字段结束,第二个代表空行)

  • CR = Carriage Return,回车符号(\r,十六进制 ascii 码为0x0D,十进制 ascii 码为 13),用于将鼠标移动到行首,并不前进至下一行。
  • LF = Line Feed,换行符号( \n, 十六进制 ascii 码为 0x0A,十进制 ascii 码为 10)。

不同的操作系统对于换行不同

  • Windows 操作系统默认的文本换行符为 CRLF;
  • Linux 系统默认使用 LF,
  • macOS 系统默认使用 LF,早期的 mac os 系统使用 CR 换行
  • 报文主体

3.请求方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cqki7q5z-1664364310883)(imgs/Pasted%20image%2020220926211105.png)]

其中常用的请求方法有GET,POST

3.1 GET

  • get提交的数据会放在url之后,以?分割URL和数据传输,参数之间以&相连
  • get方式明文传递,数据量小,不安全
  • 效率高,浏览器默认请求方式为GET请求
  • 对应的Servlet方法是doGet

我们定义一个注册页面的表单

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>注册</title>  
</head>  
<body>  
<form action="/servletProject/register" method="get">  
    用户名:<input type="text" name="username"> <br>  
    密码:<input type="password" name="password"><br>  
    <input type="submit" value="提交">  
</form>  
</body>  
</html>

再编写一个servlet

@WebServlet(value="/register")  
public class RegisterServlet extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        //获取姓名  
        String name=req.getParameter("username");  
        //获取密码  
        String password=req.getParameter("password");  
        System.out.println(name+" 的密码 "+password);  
    }
}

发送get请求之前
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJDHUTgJ-1664364310884)(imgs/Pasted%20image%2020220926213758.png)]

3.1.1发送请求之前,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9b1L7dg-1664364310885)(imgs/Pasted%20image%2020220926213905.png)]

3.1.2发送请求之前,浏览器开发者工具的状态

发送请求之后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bqTOHmo-1664364310886)(imgs/Pasted%20image%2020220926213943.png)]

3.1.3发送请求之后,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4oysmCC-1664364310887)(imgs/Pasted%20image%2020220926214016.png)]

3.1.4发送请求之前,浏览器开发者工具的状态

控制台打印
gao 的密码 123

从图中3.1.3我们可以看到传输的数据是以明文的形式传递
localhost:8080/servletProject/register?username=gao&password=123

3.2 POST

  • post方法是把提交的数据放在HTTP报文的主体中
  • 密文传递数据,数据量大,安全
  • 效率相对应没有get高
  • 对应的servlet方法是doPost

我们把注册的方法改为post

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>注册</title>  
</head>  
<body>  
<form action="/servletProject/register" method="post">  
    用户名:<input type="text" name="username"> <br>  
    密码:<input type="password" name="password"><br>  
    <input type="submit" value="提交">  
</form>  
</body>  
</html>

现在我们在servlet的后端中添加doPost的方法

@WebServlet(value="/register")  
public class RegisterServlet extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        //获取姓名  
        String name=req.getParameter("username");  
        //获取密码  
        String password=req.getParameter("password");  
        System.out.println(name+" 的密码 "+password);  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
//        super.doPost(req, resp);  
        //设置统一的编码  
        req.setCharacterEncoding("utf-8");  
        //获取姓名  
        String name=req.getParameter("username");  
        //获取密码  
        String password=req.getParameter("password");  
        System.out.println(name+" post的密码 "+password);  
       
  
    }  
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJ9pvalA-1664364310888)(imgs/Pasted%20image%2020220926215109.png)]

3.2.1发送请求之后,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epavFg82-1664364310889)(imgs/Pasted%20image%2020220926215127.png)]

3.2.2发送请求之后,浏览器的状态

发送请求之后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdWId5dF-1664364310891)(imgs/Pasted%20image%2020220926215226.png)]

3.2.3发送请求之后,浏览器的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2eyIhEhy-1664364310892)(imgs/Pasted%20image%2020220926215241.png)]

3.2.4发送请求之后,浏览器的状态

后台打印张三 post的密码 123

3.2.1 Get和Post的比较

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被收藏为书签,而POST不可以。
  • GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
  • GET请求只能进行url(appliacation-x-www-form-urlencoded)编码,而POST支持多种编码方式(multipart/form-data)。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中

POST 方法比 GET 方法安全?
按照网上大部分文章的解释,POST 比 GET 安全,因为数据在地址栏上不可见。
然而从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输,只要在网络节点上抓包,就能完整地获取数据报文。
要想安全传输,就只有加密,也就是 HTTPS

3.3 HEAD

HEAD方法跟GET方法相同,只不过服务器响应时不会返回消息体。
一个HEAD请求的响应中,HTTP头中包含的元信息应该和一个GET请求的响应消息相同。这种方法可以用来获取请求中隐含的元信息,而不用传输实体本身。

适用于
1.检查资源的有效性。 
2.检查超链接的有效性。 
3.检查网页是否被串改。 
4.多用于自动搜索机器人获取网页的标志信息,获取rss种子信息,或者传递安全认证信息等。

在servlet中添加doHead方法

@Override  
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  
    String headerAcceptLanguage = req.getHeader("Accept-Language");  
    System.out.println(headerAcceptLanguage);  
}

使用PostMan进行测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIPttzo5-1664364310893)(imgs/Pasted%20image%2020220926222153.png)]

后台输出为
zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在编程领域,"pb" 可能指代 Protocol Buffers,是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。 要使用 Protocol Buffers 中的 GETPOST 方法,我们需要首先创建一个.proto 文件,定义消息类型和服务。 GET 方法的实现步骤如下: 1. 在.proto 文件中定义一个消息类型,包含需要获取的数据字段。 2. 在.proto 文件中定义一个服务,在服务中添加一个针对 GET 请求的方法。该方法需要定义参数和返回类型。 3. 使用 Protocol Buffers 的编译器将.proto 文件编译成相应的编程语言的代码文件。 4. 在服务器端编写代码实现 GET 方法,根据客户端的请求,获取需要的数据并返回。 POST 方法的实现步骤如下: 1. 在.proto 文件中定义一个消息类型,包含需要传输的数据字段。 2. 在.proto 文件中定义一个服务,在服务中添加一个针对 POST 请求的方法。该方法需要定义参数和返回类型。 3. 使用 Protocol Buffers 的编译器将.proto 文件编译成相应的编程语言的代码文件。 4. 在客户端编写代码实现 POST 方法,将需要传输的数据序列化成 Protocol Buffers 格式,并通过网络发送给服务器端。 5. 在服务器端编写代码实现 POST 方法,接收客户端发送的数据,并根据需求进行处理。 上述过程只是大致的步骤,具体实现还需根据编程语言和框架来确定。总之,通过 Protocol Buffers 提供的消息类型和服务,我们可以方便地实现 GETPOST 方法来进行数据的交互。 ### 回答2: 在计算机科学中,"get"和 "post" 是两种常用的 HTTP 请求方法。它们用于客户端(如浏览器)与服务器之间进行数据的传输与通信。 "Get" 是一种从服务器获取数据的请求方法。当我们在浏览器中输入网址或点击某个链接时,它会发送一个 "get" 请求到服务器,并返回服务器上对应网页的内容(HTML、CSS、JavaScript等)。"Get" 请求可以携带一些参数,这些参数通常会附加在请求的URL后面,以 "?" 开头,多个参数之间使用 "&" 进行分隔。这些参数可以用来传递信息,例如搜索关键字。 "Post" 是一种向服务器提交数据的请求方法。当我们在网页中填写表单并点击提交按钮时,通常会发送一个 "post" 请求到服务器,并将表单中的数据发送给服务器进行处理。不同于 "get" 请求将参数明文显示在 URL 上,"post" 请求的参数是通过请求体(request body)进行传输,所以相对来说更安全。"Post" 请求常用于提交用户注册、登录、评论等操作。 总结来说,"get" 和 "post" 都是用于客户端与服务器之间通信的常见请求方式。"get" 主要用于获取数据,在 URL 中传递少量参数,而 "post" 则主要用于向服务器提交数据,安全性较高。在实际应用中,我们需要根据具体的业务需求来选择合适的请求方式。 ### 回答3: GETPOSTHTTP协议中常用的两种请求方法GET方法用于从服务器获取资源,它通过在URL中附加参数的方式将请求信息发送给服务器。例如,可以使用GET方法从服务器上获取一个网页文件,或者通过URL中的参数来限定返回结果,比如搜索关键词。GET请求可以通过浏览器直接发送,也可以通过编程语言的网络库发送。 例如,通过浏览器访问一个网页时,URL会包含GET请求的参数,服务器接收到请求后会根据参数的不同返回相应的结果。 而POST方法用于向服务器提交数据,它将请求信息放在HTTP请求的消息体中发送给服务器。相比GET方法POST方法适用于需要提交大量数据或进行敏感操作的情况,因为POST请求的参数不会暴露在URL中。 通常情况下,使用浏览器发送POST请求通常是通过表单提交实现的。我们在网页上填写表单内容,然后通过提交按钮将表单内容通过POST请求发送给服务器,服务器接收到请求后进行相应的处理。 同样地,通过编程语言发送POST请求也是很常见的,可以使用相应的网络库提供的接口将请求数据放在请求的消息体中,并发送给服务器。 综上所述,GETPOSTHTTP协议中常用的两种请求方法GET用于获取资源,通过URL附加参数的方式发送请求;POST用于提交数据,将请求信息放在HTTP请求的消息体中发送给服务器。无论是通过浏览器还是编程语言发送请求,都能使用这两种方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值