Httpclient 表單,json,multipart/form-data 提交 ---總結常用的方法


最近在項目中,一直在使用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 完整的一套流程

 

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM