HttpServletRequest从我的httppost中获取没有参数

时间:2011-07-18 12:31:41

标签: android tomcat servlets

我只是一个好奇的问题。我在Android中有一个HttpPost请求,看起来像这样:

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(getString(R.string.url));

//This code does not work
HttpParams params = new BasicHttpParams();
params.setParameter("type", "20");
post.setParams(params);

try {
    HttpResponse response = client.execute(post);
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

在我的服务器端,我有一个servlet,它监听请求并解析参数:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Enumeration en = request.getParameterNames();
    while (en.hasMoreElements()){
        System.out.println(en.nextElement());
    }
} 

当我执行此代码时,servlet根本看不到任何参数。但是,如果我用这段代码替换整个“参数”块:

//This code works
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);
nameValuePairs.add(new BasicNameValuePair("type", "20"));

try {
    post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
    e1.printStackTrace();
}

我的servlet可以解析参数。这不是问题,我只是要使用实体,但我的问题是,为什么我的servlet不能从第一个代码块中获取参数? setParams有什么问题?如果我将servlet作为实体,为什么servlet可以看到参数呢?

1 个答案:

答案 0 :(得分:2)

在HTML中,当我们有“http:// host / path?user = uname&amp; passwd = pass”之类的内容时,我们在问号“表单数据”之后调用部分(user = uname&amp; passwd = pass)。对于POST请求,“表单数据”可以在问号后面(如上所述)附加到URL的末尾,或者在单独的行上发送到服务器。“表单数据”被拆分为参数。参数由&amp;分隔。当我们使用GET时。

在我们的例子中,HttpPost和HttpGet类扩展了实现setParams方法的AbstractHttpMessage。对于GET和POST,此方法是相同的,但仅适用于GET!在GET的情况下,参数放在URL中。在POST的情况下,您需要将参数的实体设置为“单独的行”。

在服务器端使用servlet时,getParameters足够聪明,可以找到GET和POST的参数。

这就是为什么在服务器端我们不需要更改获取参数的代码!

希望我帮忙!