2011-07-18 126 views
1

我只是一個好奇的問題。我對Android的一個HttpPost請求看起來是這樣的:HttpServletRequest從我的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可以看到參數,如果我讓它們成爲一個實體?

回答

2

在HTML中當我們有類似「http:// host/path?user = uname & passwd = pass」的東西時,我們在問號「form data」之後調用部分(user = uname & passwd = pass) 。對於POST請求,「表單數據」可以附加在URL的末尾(如上所示),GET請求或單獨發送到服務器的服務器上。「表單數據」分爲參數。當我們使用GET時,參數被&分開。

在我們的例子中,HttpPost和HttpGet類擴展了實現setParams方法的AbstractHttpMessage。這種方法對GET和POST來說是一樣的,但只對GET做這項工作!在GET的情況下,參數被放入URL中。在POST的情況下,您需要將參數的實體設置爲「獨立線路」。

在服務器端使用servlet時,getParameters足夠聰明,可以找到GET和POST的參數。

這就是爲什麼在服務器端我們不需要更改獲取參數的代碼!

希望我幫了忙!

+0

這是一個非常好的解釋!謝謝,這正是我想要的。 – Otra

相關問題