无法从HttpServletRequest读取表单数据

时间:2014-08-27 02:01:10

标签: java http servlets

我有一个简单的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'仍然是空的......

我做错了什么?

2 个答案:

答案 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过滤器?)引起的。