我只是一个好奇的问题。我在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可以看到参数呢?
答案 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的参数。
这就是为什么在服务器端我们不需要更改获取参数的代码!
希望我帮忙!