上篇我們對HttpClient的請求和響應做了相應的分析,從代碼實現上我們看到還需要對其中的方法進行封裝複用,下面直接來看如何進行的封裝。
根據業務中的需要從下面三點進行優化:
1、url地址,參數,編碼方式
2、參數獲取
3、轉碼方法
下面直接來看代碼實現,對於上面的三點參見doPost()方法:
(1)、創建私有httpClient對象
private DefaultHttpClient httpClient;
(2)、封裝post請求方法dopost
/**
* HttpClient post提交方法
* @param url 接口地址
* @param params 接口參數,Map類型
* @param encoding 字符轉換類型(UTF-8)
* @return 返回String
* @throws IOException
*/
public String doPost(String url, Map params, String encoding)throws IOException
{
String resultBody = null;
//創建http post請求
HttpPost httpPost = new HttpPost(url);
////設置報文頭
httpPost.setHeader("Referer", url);
//判斷url參數是否爲null
if(params != null && !params.isEmpty())
{
//調用createNameValuePair方法,將參數放入List
List nvps = createNameValuePair(params);
//對參數進行編碼後設置httpPost實體內容。
//說明:UrlEncodedFormEntity對POST請求中的參數進行轉碼,encoding及希望的類型(例如UTF-8)
httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));
}
//發送請求
HttpResponse response = httpClient.execute(httpPost);
//對響應結果進行判斷
if(response.getStatusLine().getStatusCode() != 200 && response.getStatusLine().getStatusCode() != 302)
return null;
//獲取返回數據
HttpEntity entity = response.getEntity();
//轉爲String
resultBody = EntityUtils.toString(entity, encoding);
entity.consumeContent();
return resultBody;
}
(3)、對map參數進行獲取轉換list
/**
* 將參數放入List
* @param params map類型
* @return 返回list
*/
private List createNameValuePair(Map params)
{
List nameValuePairs = new ArrayList();
String key;
for(Iterator iterator = params.keySet().iterator(); iterator.hasNext(); nameValuePairs.add(new BasicNameValuePair(key, (String)params.get(key))))
key = (String)iterator.next();
return nameValuePairs;
}
(4)、封裝get請求方法doGet
/**
* HttpClient post提交方法
* @param url 接口地址
* @return 返回String類型
* @throws IOException
*/
public String doGet(String url)
throws IOException
{
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpClient.execute(httpget);
if(response.getStatusLine().getStatusCode() != 200)
{
return null;
} else
{
HttpEntity entity = response.getEntity();
String resultBody = EntityUtils.toString(entity);
entity.consumeContent();
return resultBody;
}
}
小結
到此,一個基本的HttpClient的請求過程基本完成了,doPost方法基本滿足了我們日常業務的需要,當然如有參數有其他要求,我們添加相應的重載方法即可。後續HttpClient研究將是Http狀態及Http認證方面。