HTTP请求的GET,DELETE请求能有body吗?

49 篇文章 2 订阅
8 篇文章 0 订阅

昨天上班的时候后端有一个delete请求,要求我把参数放在urlquery string上面。于是我说其实可以放在请求的实体中,但是后端说deleteget是没有请求实体的。这和我的记忆不太一样。那么到底deletepost请求能有实体吗?

先看网上的资料

先通过简单的搜索在stack overflow找到一个类似的问题, Is an entity body allowed for an HTTP DELETE request?。回答中说到并没有禁止和不推荐在getdelete方法中使用实体。意思就是说其实是可以使用的。那么再看回答中给出的规范的资料,确实http规范中并没有说明有任何方法不能使用
实体。

继续探究

但是有时候现实生活往往和规范不一致。所以我们还要试验一下,首先是我们先用node搭建一个服务器,打印收到的实体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const http = require('http');

http.createServer((req, res) => {
    const { method, url } = req;
    console.log(`METHOD: ${method}`);
    console.log(`URL:${url}`);
    const body = [];

    req
    .on('data', (chunk) => {
        body.push(chunk)
    })
    .on('end', () => {
        let bodyString = Buffer.concat(body).toString();
        console.log(`BODY: ${body}`)
        res.end(bodyString || 'body is empty');
    });
}).listen(3000);

在浏览器中使用ajax测试

get请求

在浏览器中打开localhost:300页面,并且在控制台执行以下代码:

1
2
3
4
5
(function() {
    const ajax = new XMLHttpRequest();
    ajax.open('get', 'http://localhost:3000?qs=qs');
    ajax.send('name=bob');
})()

服务器打印:

1
2
3
METHOD: GET
URL:/?qs=qs
BODY:

没有接收到body

delete请求

delete请求:
在浏览器中打开localhost:300页面,并且在控制台执行以下代码:

1
2
3
4
5
(function() {
    const ajax = new XMLHttpRequest();
    ajax.open('delete', 'http://localhost:3000?qs=qs');
    ajax.send('name=bob');
})()

服务器打印:

1
2
3
METHOD: DELETE
URL:/?qs=qs
BODY: name=bob

接收到body

使用curl命令测试

get请求

命令行中执行下面的命令:

1
curl -X GET -d 'name=bob'  localhost:3000

 

服务器打印:

1
2
3
METHOD: GET
URL:/
BODY: name=bob

 

接收到body

delete请求

1
curl -X DELETE -d 'name=bob'  localhost:3000

服务器打印:

1
2
3
METHOD: DELETE
URL:/
BODY: name=bob

 

接收到body

发现curl命令的body都是可以正常发送,但是浏览器中的ajax却不行这是为什么呢?查看XMLHttpRequest规范发现:

The send(body) method must run these steps:

1. If state is not opened, then throw an "InvalidStateError" DOMException.
2. If the send() flag is set, then throw an "InvalidStateError" DOMException.
3. If the request method is GET or HEAD, set body to null.
4. If body is not null, then:
5.  ....

原来XMLHttpRequest规范定义method时get或者head的时候,XMLHttpRequest会忽略body。所以会产生前面实验的现象。

那么这些请求到底有什么不一样呢

其实从http报文的角度看,他们完全都是一样的。没有任何区别,大家能发送的信息都是一样的。你能做的我也能做,不一样的在于method所代表的这个请求的语义。

结论

最后总结一下,在http规范任何方法都能发送请求实体。他们报文时没有任何区别的,但是在浏览器中,因为XMLHttpRequest规范的限制,浏览器中ajax发送的http请求,getdelete请求不能携带实体。

### 回答1: 不可以。GET 请求是不支持使用 @RequestBody 注解的,因为 GET 请求是一种幂等的请求,不需要发送请求,因此不需要使用 @RequestBody 来处理请求。通常情况下,GET 请求使用请求参数来传递数据,可以使用 @RequestParam 注解来处理请求参数。 ### 回答2: get请求可以使用@RequestParam注解来接收参数,而不能直接使用@RequestBody注解。@RequestBody注解通常用于POST请求,用于接收请求中的参数。GET请求通常将参数放在URL的查询参数中,通过@RequestParam注解来接收。@RequestParam注解可以指定参数名、是否必需、默认值等。使用@RequestParam注解时,Spring会自动将参数转换为对应的类型。而@RequestBody注解则将请求中的参数绑定到方法的参数上,适用于接收JSON或XML格式的请求。 在RESTful风格的API中,通常使用GET请求获取资源,因此不建议使用@RequestBody注解来接收参数。尽管HTTP协议允许GET请求携带请求,但实际上这种情况很少见,并且不符合RESTful设计的原则。所以,对于GET请求,应该使用@RequestParam注解来接收参数,而不是@RequestBody注解。 ### 回答3: 在使用Spring框架开发Web应用时,通常使用GET请求获取资源,而不建议在GET请求中使用@RequestBody注解。 首先,GET请求是一种向服务器获取资源的请求方式,它将参数包含在URL中,而不是请求中。GET请求的参数通过URL的查询字符串传递,因此无法使用@RequestBody注解来获取请求中的数据。@RequestBody注解主要用于从请求中提取JSON或XML格式的数据,并将其转换为Java对象。因此,@RequestBody注解通常用于POST、PUT、DELETE请求方法,用于处理请求中的数据。 其次,根据HTTP协议的规范,GET请求不应该有请求。因为GET请求的主要目的是获取资源,而不修改或发送数据到服务器。GET请求请求对服务器来说是可选的,而且大多数服务器也不处理或忽略请求中的数据。 因此,为了遵循HTTP协议的规范和保持代码的清晰和一致性,不建议在GET请求中使用@RequestBody注解。如果需要在GET请求中传递数据,可以通过URL的查询参数或路径参数来传递数据。 需要注意的是,Spring MVC框架允许将GET请求中的@RequestBody注解与@RequestParam一起使用,但这并不是推荐的做法。因为请求中的数据不应该出现在GET请求中,这种做法容易引起混淆和不必要的错误。所以,最好遵循HTTP协议的规范,保持GET请求的纯粹性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值