我有一个简单的xmlHttpRequest,它将一个DELETE提交给一个servlet。
这是JS:
function sendDELETE () {
var http = new XMLHttpRequest();
var url = "myServlet";
var params = "param="+document.getElementById("param").value;
http.open("DELETE", url, false);
//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = function() {//Call a function when the state changes.
if(http.readyState == 4 && http.status == 200) {
}
}
http.send(params);
}
由按钮上的onClick事件调用。
这是chrome dev工具显示的内容:
Request URL:http://xxxxxx/myServlet
Request Method:DELETE
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:36
Content-type:application/x-www-form-urlencoded
Host:xxxxxxxxx
Origin:http://xxxxxxx
Referer:http://xxxxxxxxxxx/main.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
Form Dataview parsed
param=value
Response Headersview source
Connection:Keep-Alive
Content-Length:0
Content-Type:text/html
Date:Wed, 27 Aug 2014 01:50:10 GMT
Keep-Alive:timeout=65, max=7998
Server:Apache-Coyote/1.1
通过查看此信息,我可以清楚地看到表单数据在请求中具有param = value OUT
在我doDelete
的服务器上,我尝试了两种方式:
String param = req.getParameter("param");
和
String inputMap = CharStreams.toString(req.getReader());
String [] parts = inputMap.split("=");
String param = parts[1];
但两者都不起作用 - ' param'仍然是空的......
我做错了什么?
答案 0 :(得分:1)
只有POST请求将参数作为请求正文中的实体。您必须将其作为URL的一部分发送。
请参阅RFC 2616:" DELETE方法请求源服务器删除Request-URI"标识的资源。
答案 1 :(得分:0)
从我所看到的,你根本就没有做错任何事。
在HTTP中,任何请求都可以有一个请求正文(请参阅http://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#message.body.length)。此外,HTTP并不关心有效负载的类型。
为DELETE发送有效负载是否有意义是一个单独的问题;毕竟,要删除的资源无论如何都需要通过请求URI来识别。
如果你无法在有效负载中检索请求主体,这可能是由servlet实现中的错误(这是什么?),或者客户端和服务器之间的某些内容(代理?servlet过滤器?)引起的。