最近在項目中,一直在使用HttpClient 中的方法,這里我進行一些方法的匯總,也是結合了一些大牛寫的代碼,以備不時之需
官話:HttpClient 是Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議
在我的博客我的常用工具了中有關於httpclient 的常用方法,在平常的開發中是足夠用了----------在這里我細致的總結一下
1.我們在使用httpclient 第一步就是創建CloseableHttpClient 實例,這也是官方推薦方法:
CloseableHttpClient httpclient = HttpClients.createDefault()
2.創建 httpget 與 httppost 的實例,我們進行網絡連接的關鍵步驟:
//post 請求
HttpPost httppost =new HttpPost(url); // get請求 HttpGet httpget =new HttpGet(url);
3. addHeader(arg0, arg1) :見名知意,可以為我們請求加上請求頭,cookie
//加cookie 頭
httppost.addHeader("Cookie","JSESSIONID=fnwebidwn==");
//User-Agent
httppost.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36");
......
4. httppost.setEntity(entity); 放入需要傳遞的參數,只出現在post 方法中,因為get直接在地址后面追加參數。
httppost 我們常用三種都是需要我們掌握的
1.傳遞json 類型的字符串
2.傳遞form表單
3.Multipart/form-data 類型 的數據
(1),第一個比較簡單,就是將我們的json參數轉換為字符串進行傳遞,這個不多講,使用過微信接口就應該不會陌生,很簡單的
// outstr 是json字符串類型的參數,
httppost.setEntity(new StringEntity(outstr, "UTF-8"));
(2),第二種傳遞form 表單,類似於我們form 表單提交的POST 請求,將參數進行了封裝,使用時候必須將參數封裝
ArrayList<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>(); 中
//在集合中放入我們表單中的name --- value 鍵值對 List<BasicNameValuePair> pair =new ArrayList<BasicNameValuePair>(); pair.add(new BasicNameValuePair("name", "value")); pair.add(new BasicNameValuePair("name2", "value2")); pair.add(new BasicNameValuePair("name3", "value3")); //-------工作中一般將參數封裝在Map中,我們遍歷Map往 BasicNameValuePair 集合中放入 List<BasicNameValuePair> pair =new ArrayList<BasicNameValuePair>(); //我們遍歷map 將數據轉化為我們的表單數據 for (Map.Entry<String,String> entry: map.entrySet()) { pair.add(new BasicNameValuePair(entry.getKey(),entry.getValue())); } //httppost 中放入我們的經過url編碼的表單參數 httppost.setEntity(new UrlEncodedFormEntity(pair));
(3). 傳遞Multipart/form-data 類型 的數據,這種數據類型在文件上傳中使用的,類似有form 表單設置了 enctype="multipart/form-data", 默認表單是 application/x-www-form-urlencoded
關於這兩個的區別:multipart/form-data ,用於文件的上傳,設置表單的MIME編碼,二進制傳輸數據,參數會以boundary進行分割
application/x-www-form-urlencoded:不能進行文件的上傳,我們一般form表單默認就是這個類型
一般只要不涉及到文件上傳,建議還是使用默認 application/x-www-form-urlencoded 我們第二種提交方式
//創建 MultipartEntityBuilder,以此來構建我們的參數 MultipartEntityBuilder EntityBuilder = MultipartEntityBuilder.create(); //設置字符編碼,防止亂碼 ContentType contentType=ContentType.create("text/plain",Charset.forName("UTF-8")); //填充我們的文本內容,這里相當於input 框中的 name 與value EntityBuilder.addPart("name", new StringBody("value",contentType)); EntityBuilder.addPart("name1", new StringBody("value1",contentType)); EntityBuilder.addPart("name2", new StringBody("value2",contentType)); //上傳我們的文件 EntityBuilder.addBinaryBody("filename", new File("C:\\Users\\Administrator\\Desktop\\testImg.png")); //參數組裝 post.setEntity(EntityBuilder.build());
這樣,三種常見的參數提交方式就OK了,親測可用哦;
5.參數post.setEntity("entity對象“”)封裝好之后,就是進行發送網絡請求了 ,返回 HttpResponse
HttpResponse response=httpclient.execute(post);
6.接下來就是解析返回來的 HttpResponse ,有很多辦法,但是我看到很多大牛寫到這里解析 HttpResponse 時候,都會創建一個實現了 ResponseHandler 的處理器,進行
自己編碼后續的處理;如下:
package com.project.utils; import java.io.IOException; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpResponseException; import org.apache.http.client.ResponseHandler; import org.apache.http.util.EntityUtils; public class Utf8ResponseHandler implements ResponseHandler<String> { /* *實現utf-8編碼的返回數據類型,實現ttpclient ResponseHandler接口方法 * *copy from {@link org.apache.http.impl.client.BasicResponseHandler}官方默認提供 */ public static final ResponseHandler<String> INSTANCE = new Utf8ResponseHandler(); @Override public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { final StatusLine statusLine = response.getStatusLine(); final HttpEntity entity = response.getEntity(); if (statusLine.getStatusCode() >= 300) { EntityUtils.consume(entity); throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase()); } return entity == null ? null : EntityUtils.toString(entity, Consts.UTF_8); } }
其中:
response.getStatusLine().getStatusCode()//可以獲得服務的響應碼
HttpEntity entity = response.getEntity() //獲取響應的對象內容
EntityUtils.toString(entity, Consts.UTF_8) //進行相應內容文本展示並編碼
7. 完成之后,釋放資源
finally { httppost.releaseConnection(); }
..........................這就是HttpClient 完整的一套流程
