激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - HttpClient 在Java項目中的使用詳解

HttpClient 在Java項目中的使用詳解

2020-01-10 17:42wangpeng047 JAVA教程

HttpClient作為訪問Http服務(wù)的客戶端訪問程序已經(jīng)被廣泛使用,提高了開發(fā)效率,也提高了代碼的健壯性。因此熟練掌握HttpClient是必需的,關(guān)于httpclient感興趣的朋友可以參考本篇文章

Http協(xié)議的重要性相信不用我多說了,HttpClient相比傳統(tǒng)JDK自帶的URLConnection,增加了易用性和靈活性(具體區(qū)別,日后我們再討論),它不僅是客戶端發(fā)送Http請求變得容易,而且也方便了開發(fā)人員測試接口(基于Http協(xié)議的),即提高了開發(fā)的效率,也方便提高代碼的健壯性。因此熟練掌握HttpClient是很重要的必修內(nèi)容,掌握HttpClient后,相信對于Http協(xié)議的了解會更加深入。

一、簡介

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。

下載地址: http://hc.apache.org/downloads.cgi

二、特性

1. 基于標(biāo)準(zhǔn)、純凈的java語言。實現(xiàn)了Http1.0和Http1.1
2. 以可擴展的面向?qū)ο蟮慕Y(jié)構(gòu)實現(xiàn)了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支持HTTPS協(xié)議。
4. 通過Http代理建立透明的連接。
5. 利用CONNECT方法通過Http代理建立隧道的https連接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。
7. 插件式的自定義認證方案。
8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
9. 連接管理器支持多線程應(yīng)用。支持設(shè)置最大連接數(shù),同時支持設(shè)置每個主機的最大連接數(shù),發(fā)現(xiàn)并關(guān)閉過期的連接。
10. 自動處理Set-Cookie中的Cookie。
11. 插件式的自定義Cookie策略。
12. Request的輸出流可以避免流中內(nèi)容直接緩沖到socket服務(wù)器。
13. Response的輸入流可以有效的從socket服務(wù)器直接讀取相應(yīng)內(nèi)容。
14. 在http1.0和http1.1中利用KeepAlive保持持久連接。
15. 直接獲取服務(wù)器發(fā)送的response code和 headers。
16. 設(shè)置連接超時的能力。
17. 實驗性的支持http1.1 response caching。
18. 源代碼基于Apache License 可免費獲取。

三、使用方法

使用HttpClient發(fā)送請求、接收響應(yīng)很簡單,一般需要如下幾步即可。

1. 創(chuàng)建HttpClient對象。

2. 創(chuàng)建請求方法的實例,并指定請求URL。如果需要發(fā)送GET請求,創(chuàng)建HttpGet對象;如果需要發(fā)送POST請求,創(chuàng)建HttpPost對象。

3. 如果需要發(fā)送請求參數(shù),可調(diào)用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數(shù);對于HttpPost對象而言,也可調(diào)用setEntity(HttpEntity entity)方法來設(shè)置請求參數(shù)。

4. 調(diào)用HttpClient對象的execute(HttpUriRequest request)發(fā)送請求,該方法返回一個HttpResponse。

5. 調(diào)用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務(wù)器的響應(yīng)內(nèi)容。程序可通過該對象獲取服務(wù)器的響應(yīng)內(nèi)容。

6. 釋放連接。無論執(zhí)行方法是否成功,都必須釋放連接

四、實例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
package com.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.junit.Test;
public class HttpClientTest {
  @Test
  public void jUnitTest() {
    get();
  }
  /**
   * HttpClient連接SSL
   */
  public void ssl() {
    CloseableHttpClient httpclient = null;
    try {
      KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
      FileInputStream instream = new FileInputStream(new File("d:\\tomcat.keystore"));
      try {
        // 加載keyStore d:\\tomcat.keystore 
        trustStore.load(instream, "123456".toCharArray());
      } catch (CertificateException e) {
        e.printStackTrace();
      } finally {
        try {
          instream.close();
        } catch (Exception ignore) {
        }
      }
      // 相信自己的CA和所有自簽名的證書
      SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
      // 只允許使用TLSv1協(xié)議
      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
          SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
      httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
      // 創(chuàng)建http請求(get方式)
      HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action");
      System.out.println("executing request" + httpget.getRequestLine());
      CloseableHttpResponse response = httpclient.execute(httpget);
      try {
        HttpEntity entity = response.getEntity();
        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());
        if (entity != null) {
          System.out.println("Response content length: " + entity.getContentLength());
          System.out.println(EntityUtils.toString(entity));
          EntityUtils.consume(entity);
        }
      } finally {
        response.close();
      }
    } catch (ParseException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (KeyManagementException e) {
      e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } catch (KeyStoreException e) {
      e.printStackTrace();
    } finally {
      if (httpclient != null) {
        try {
          httpclient.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
  /**
   * post方式提交表單(模擬用戶登錄請求)
   */
  public void postForm() {
    // 創(chuàng)建默認的httpClient實例. 
    CloseableHttpClient httpclient = HttpClients.createDefault();
    // 創(chuàng)建httppost 
    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
    // 創(chuàng)建參數(shù)隊列 
    List<namevaluepair> formparams = new ArrayList<namevaluepair>();
    formparams.add(new BasicNameValuePair("username", "admin"));
    formparams.add(new BasicNameValuePair("password", "123456"));
    UrlEncodedFormEntity uefEntity;
    try {
      uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
      httppost.setEntity(uefEntity);
      System.out.println("executing request " + httppost.getURI());
      CloseableHttpResponse response = httpclient.execute(httppost);
      try {
        HttpEntity entity = response.getEntity();
        if (entity != null) {
          System.out.println("--------------------------------------");
          System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));
          System.out.println("--------------------------------------");
        }
      } finally {
        response.close();
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e1) {
      e1.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // 關(guān)閉連接,釋放資源 
      try {
        httpclient.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  /**
   * 發(fā)送 post請求訪問本地應(yīng)用并根據(jù)傳遞參數(shù)不同返回不同結(jié)果
   */
  public void post() {
    // 創(chuàng)建默認的httpClient實例. 
    CloseableHttpClient httpclient = HttpClients.createDefault();
    // 創(chuàng)建httppost 
    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
    // 創(chuàng)建參數(shù)隊列 
    List<namevaluepair> formparams = new ArrayList<namevaluepair>();
    formparams.add(new BasicNameValuePair("type", "house"));
    UrlEncodedFormEntity uefEntity;
    try {
      uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
      httppost.setEntity(uefEntity);
      System.out.println("executing request " + httppost.getURI());
      CloseableHttpResponse response = httpclient.execute(httppost);
      try {
        HttpEntity entity = response.getEntity();
        if (entity != null) {
          System.out.println("--------------------------------------");
          System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));
          System.out.println("--------------------------------------");
        }
      } finally {
        response.close();
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e1) {
      e1.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // 關(guān)閉連接,釋放資源 
      try {
        httpclient.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  /**
   * 發(fā)送 get請求
   */
  public void get() {
    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
      // 創(chuàng)建httpget. 
      HttpGet httpget = new HttpGet("http://www.baidu.com/");
      System.out.println("executing request " + httpget.getURI());
      // 執(zhí)行g(shù)et請求. 
      CloseableHttpResponse response = httpclient.execute(httpget);
      try {
        // 獲取響應(yīng)實體 
        HttpEntity entity = response.getEntity();
        System.out.println("--------------------------------------");
        // 打印響應(yīng)狀態(tài) 
        System.out.println(response.getStatusLine());
        if (entity != null) {
          // 打印響應(yīng)內(nèi)容長度 
          System.out.println("Response content length: " + entity.getContentLength());
          // 打印響應(yīng)內(nèi)容 
          System.out.println("Response content: " + EntityUtils.toString(entity));
        }
        System.out.println("------------------------------------");
      } finally {
        response.close();
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (ParseException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // 關(guān)閉連接,釋放資源 
      try {
        httpclient.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  /**
   * 上傳文件
   */
  public void upload() {
    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
      HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action");
      FileBody bin = new FileBody(new File("F:\\image\\sendpix0.jpg"));
      StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);
      HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build();
      httppost.setEntity(reqEntity);
      System.out.println("executing request " + httppost.getRequestLine());
      CloseableHttpResponse response = httpclient.execute(httppost);
      try {
        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());
        HttpEntity resEntity = response.getEntity();
        if (resEntity != null) {
          System.out.println("Response content length: " + resEntity.getContentLength());
        }
        EntityUtils.consume(resEntity);
      } finally {
        response.close();
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        httpclient.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}
</namevaluepair></namevaluepair>
</namevaluepair></namevaluepair>

本實例是采用HttpClient4.3最新版本。該版本與之前的代碼寫法風(fēng)格相差較大,大家多留意下。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产二区三区视频 | 毛片视频观看 | 午夜视频久久久 | 亚州视频在线 | 亚洲午夜影院在线观看 | 欧美黄色性视频 | 久久国产精品久久精品国产演员表 | 欧美乱淫 | 日本久久久网站 | 大西瓜永久免费av在线 | a级黄色片视频 | 成年人黄色免费网站 | 精品国产一区二区三区免费 | 九色新网址 | 日韩色视频在线观看 | 一区二区三区在线观看国产 | 久久精品日韩一区 | 最新久久免费视频 | 国产无遮挡一级毛片 | free japan xxxxhdsex69 | 一级免费毛片 | av在线浏览 | 免费看污视频在线观看 | av在线视| 羞羞网站视频 | 色偷偷欧美| 国产精品999在线观看 | 国产精品午夜小视频观看 | 色婷婷av一区二区三区久久 | 国产精品a一 | 黄色大片网站在线观看 | 成人视屏免费看 | 欧美视屏一区二区 | 国产一级性生活视频 | 久久久线视频 | 韩国十九禁高潮床戏在线观看 | 中文字幕 欧美 日韩 | 91久久91久久精品免观看 | 一级一级一级毛片 | 九九黄色| 亚洲国产成人久久成人52 |