Sci*_*cis 8 spring spring-mvc http-delete
我有一个简单的方法(在Tomcat 6.0.35上运行),如下所示:
@RequestMapping(value = "/bla/d", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void d(@RequestParam String d){
//logic here
}
Run Code Online (Sandbox Code Playgroud)
当我发送一个DELETE请求,其中包含类似参数的帖子(d = gggg在正文中),我得到400 Bad Request.但如果我把它改成
@RequestMapping(value = "/bla/d", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void d(@RequestParam String d){
//logic here
}
Run Code Online (Sandbox Code Playgroud)
它完美地运作.我正在使用Firefox附加组件来测试它(以及python和Spring的RestTemplate,结果相同)这里的请求是如何看待POST的(a是一个带有参数a的cope粘贴方法):
POST /bla/a HTTP/1.1
Host: ~~~~:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 7
Pragma: no-cache
Cache-Control: no-cache
a=asdas
HTTP/1.1 204 No Content
Server: Apache-Coyote/1.1
Date: Tue, 12 Jun 2012 09:29:46 GMT
Run Code Online (Sandbox Code Playgroud)
删除看起来像:
DELETE /bla/d HTTP/1.1
Host: ~~~~~:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 7
d=asdas
HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 971
Date: Tue, 12 Jun 2012 09:30:04 GMT
Connection: close
Run Code Online (Sandbox Code Playgroud)
请帮助我,我可能会错过一些愚蠢的东西,但我只是看不到它.我最初的问题是通过DELETE请求通过类似邮件的主体发送数组,但似乎更基本的东西是错误的.
Sci*_*cis 15
在做了一些研究和调试后,我发现Spring的ServletWebREquest调用了org.apache.catalina.connector.RequestFacade.getParameterValues的getParameterValues,它调用了getParameterValues,其中我找到了以下行(Request.java 2599-2600):
if (!getMethod().equalsIgnoreCase("POST"))
return;
Run Code Online (Sandbox Code Playgroud)
这会杀死任何尝试使用DELETE发送类似POST的参数,这意味着即使RFC 不限制此类使用,Tomcat也会主动限制此用例(虽然它确实说某些现有实现可能会拒绝此类请求,但Tomcat只会抛出它的参数远).是什么让一个人使用Spring和Tomcat并尝试将带有参数的DELETE请求发送给丑陋的解决方案,例如使用@RequestBody获取所有请求体并手动提取它,这使得您想要删除某些地图的某些地方的无辜方法包含请求正文.
@fmucar
| 归档时间: |
|
| 查看次数: |
6481 次 |
| 最近记录: |