GET 和 POST 请求的区别

关于你上次提到的问题:
// --TCP/IP 协议详解卷3
13.3.1 报文类型:请求与响应
HTTP / 1 . 0报文有两种类型:请求和响应。HTTP / 1 . 0请求的格式是:
reqe t - l i n e
headers ( 0或有多个)
<blank line>
body (只对POST请求有效)

request - l i n e的格式是:
request request-URI HTTP版本号

支持以下三种请求:
1) G E T请求,返回re q u e s t - U R I所指出的任意信息。
2) H E A D请求,类似于G E T请求,但服务器程序只返回指定文档的首部信息,而不包含实际的文档内容。该请求通常被用来测试超文本链接的正确性、可访问性和最近的修改。
3) P O S T请求用来发送电子邮件、新闻或发送能由交互用户填写的表格。这是唯一需要在请求中发送b o d y的请求。使用P O S T请求时需要在报文首部C o n t e n t - L e n g t h字段中
指出b o d y的长度。
// --TCP/IP 协议详解卷3


明白?get 请求表示客户端请求一个uri,服务器返回客户端请求的uri,post请求表示客户端请求的时候还要提交数据,比喻提交form表单,要提交的数据会放到请求报文的body部分。服务器收到后这样的请求后通常需要来处理这些数据。
应聘j2ee开发时问这个问题说明提问着的重点是服务器对这两种请求的处理有什么不同,而不是这两种请求的报文有什么不同。当然作为一个jsp servlet的开发者一般你是不会感觉到着两种请求有什么不同的,因为web服务器已经对这些请求进行处理了,web服务器调用相应的 jsp/servlet来响应客户端请求的时候,对于post的请求,web服务器已经把客户端提交的数据取出来,添到request对象中去了。不过,对于get、post的请求servlet 的 doGet、 doPost方法会被响应调用。也就是说如果客户端送来的是一个get的请求,那么你写到servlet中的dopost()方法中的代码是不会执行的,反之如果是post的请求,写在doget()中代码是不会被调用的(对于所有方式的请求,写在doservice的代码是会被调用的,因为在HttpServlet类中doGet doPost的请求都是由doService来分发的,具体的看关于servlet的生命周期介绍)。

 

### GETPOST请求的主要区别 GETPOST是HTTP协议中最常用的两种请求方式,它们之间存在显著的区别: #### 1. 设计目的 - **GET** 被设计用于从服务器获取资源。它通常用于查询操作,不应对服务器上的数据产生副作用[^1]。 - **POST** 则被设计用于向服务器提交数据或创建新的资源。它可以触发服务器端的状态变化或数据库更新[^1]。 #### 2. 数据传输位置 - **GET** 将参数附加到URL中,通过查询字符串的形式发送给服务器。这种方式使得数据可见于浏览器地址栏。 - **POST** 把数据放在HTTP消息体(Body)中进行传输,因此不会暴露在URL中。 #### 3. 安全性 - 使用 **GET** 方法时,敏感信息可能会泄露,因为这些信息会直接显示在URL中,并可能保存在浏览历史记录或者日志文件中。 - 相较之下,**POST** 更加安全一些,因为它不会把数据展示在URL里,尽管如此,在未加密的情况下仍然可以通过抓包工具查看实际发送的数据[^1]。 #### 4. 数据大小限制 - 对于 **GET** 请求来说,由于其依赖于URL来携带参数,所以受制于浏览器Web服务器对于URL长度的支持情况,一般情况下最大约为2KB (具体取决于实现)。 - 而 **POST** 支持更大的数据量传输,默认情况下理论上没有严格的上限(实际上受限于应用层配置),比如上传文件等场景下经常需要用到POST方法[^1]。 #### 5. 缓存机制 - 浏览器会对相同的 **GET** 请求做缓存处理,这意味着如果再次发起同样的请求,则有可能返回之前的结果而不是重新联系服务端[^2]。 - **POST** 请求默认是不会被缓存的,每次都会发送完整的请求至目标站点。 #### 6. 幂等性 - 所谓幂等是指多次执行同一操作所产生的效果是一样的。按照标准定义,**GET** 应该是一个幂等的操作,即无论调用多少次都不会改变服务器状态[^2]。 - 然而,**POST** 不具备这种特性,每一次调用都可能导致不同的结果发生,例如增加新纪录或是修改现有条目等内容[^2]。 ```python import requests # Example of a GET request response_get = requests.get('https://example.com/api/data', params={'key': 'value'}) # Example of a POST request response_post = requests.post('https://example.com/api/submit', data={'field': 'input'}) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值