HttpClient は、クライアント側の HTTP 通信実装ライブラリです。 HttpClient の目的は、HTTP メッセージを送受信することです。
Http プロトコルの重要性についてはこれ以上説明する必要はないと思います。従来の JDK に付属する URLConnection と比較して、HttpClient は使いやすさと柔軟性が向上しています (具体的な違いについては後で説明します)。これは、クライアントが HTTP リクエストを送信する方法であるだけでなく、開発者が (HTTP プロトコルに基づいて) インターフェイスをテストすることも容易になるため、開発の効率が向上するだけでなく、コードの堅牢性。したがって、HttpClient を習得することは非常に重要であり、必須です。HttpClient を習得すると、Http プロトコルの理解がさらに深まると思います。
1. はじめに
HttpClient は、Apache Jakarta Common のサブプロジェクトであり、HTTP プロトコルをサポートする効率的で最新の機能豊富なクライアント プログラミング ツールキットを提供するために使用され、HTTP プロトコルの最新バージョンと推奨事項をサポートします。 HttpClient は多くのプロジェクトで使用されています。たとえば、Apache Jakarta 上の他の 2 つの有名なオープン ソース プロジェクト、Cactus および HTMLUnit はどちらも HttpClient を使用しています。
ダウンロードアドレス: http://hc.apache.org/downloads.cgi
2. 特徴
1. 標準および純粋な Java 言語に基づいています。 Http1.0とHttp1.1を実装
2. すべての Http メソッド (GET、POST、PUT、DELETE、HEAD、OPTIONS、および TRACE) を拡張可能なオブジェクト指向構造で実装します。
3. HTTPS プロトコルをサポートします。
4. HTTP プロキシを介して透過的な接続を確立します。
5. CONNECT メソッドを使用して、HTTP プロキシ経由でトンネリングされた https 接続を確立します。
6. 基本、ダイジェスト、NTLMv1、NTLMv2、NTLM2 セッション、SNPNEGO/Kerberos 認証方式。
7. プラグインのカスタム認証スキーム。
8. ポータブルで信頼性の高いソケット ファクトリにより、サードパーティ ソリューションの使用が容易になります。
9. 接続マネージャーはマルチスレッド アプリケーションをサポートします。最大接続数の設定と各ホストの最大接続数の設定をサポートし、期限切れの接続を検出して閉じることができます。
10. Set-Cookie で Cookie を自動的に処理します。
11. プラグインのカスタム Cookie ポリシー。
12. リクエストの出力ストリームは、ストリーム内のコンテンツをソケット サーバーに直接バッファリングすることを回避できます。
13. Response の入力ストリームは、対応するコンテンツをソケット サーバーから直接効果的に読み取ることができます。
14. KeepAlive を使用して、http1.0 および http1.1 で永続的な接続を維持します。
15. サーバーから送信された応答コードとヘッダーを直接取得します。
16. 接続タイムアウトを設定する機能。
17. http1.1 応答キャッシュの実験的サポート。
18. ソース コードは、Apache ライセンスに基づいて自由に利用できます。
3. 使用方法
HttpClient を使用してリクエストを送信し、レスポンスを受信するのは非常に簡単です。通常、次の手順が必要です。
1. HttpClient オブジェクトを作成します。
2. リクエスト メソッドのインスタンスを作成し、リクエスト URL を指定します。 GET リクエストを送信する必要がある場合は HttpGet オブジェクトを作成し、POST リクエストを送信する必要がある場合は HttpPost オブジェクトを作成します。
3. リクエスト パラメータを送信する必要がある場合は、HttpGet および HttpPost に共通の setParams (HttpParams params) メソッドを呼び出してリクエスト パラメータを追加できます。HttpPost オブジェクトの場合は、setEntity (HttpEntity エンティティ) メソッドを呼び出してリクエストを設定することもできます。パラメータ。
4. HttpClient オブジェクトのexecute(HttpUriRequest request)を呼び出してリクエストを送信します。このメソッドはHttpResponseを返します。
5. HttpResponse の getAllHeaders()、getHeaders(String name) およびその他のメソッドを呼び出してサーバーの応答ヘッダーを取得し、HttpResponse の getEntity() メソッドを呼び出して、サーバーの応答コンテンツをラップする HttpEntity オブジェクトを取得します。プログラムは、このオブジェクトを通じてサーバーの応答コンテンツを取得できます。
6. 接続を解除します。実行方法が成功したかどうかに関係なく、接続は解放される必要があります
4. 例
パッケージ com.test; インポート java.io.FileInputStream; インポート java.security.KeyManagementException;セキュリティ.KeyStoreException; インポート java.security.NoSuchAlgorithmException; java.security.cert.CertificateException; インポート java.util.ArrayList; インポート org.apache.http.NameValuePair; org.apache.http.ParseException; インポート org.apache.http.client.ClientProtocolException; org.apache.http.client.entity.UrlEncodedFormEntity; インポート org.apache.http.client.methods.HttpGet; インポート org.apache.http.client.methods.HttpPost ;輸入org.apache.http.conn.ssl.SSLConnectionSocketFactory; インポート org.apache.http.conn.ssl.TrustSelfSignedStrategy; org.apache.http.entity.mime.MultipartEntityBuilder; org.apache.http.entity.mime.content.FileBody; インポート org.apache.http.entity.mime.content.StringBody; インポート org.apache.http.impl.client; .client.HttpClients; インポート org.apache.http.message.BasicNameValuePair; 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 を試してください。 KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new File("d://tomcat.keystore")); // keyStore をロード d://tomcat.keystore trustStore.load(instream) , "123456".toCharArray()); } catch (CertificateException e) { e.printStackTrace() }; { instream.close(); } catch (Exceptionignore) { } } // 独自の CA とすべての自己署名証明書を信頼します SSLContext sslcontext = SSLContexts.custom().loadTrustmaterial(trustStore, new TrustSelfSignedStrategy()).build() ; // TLSv1 プロトコルの使用のみを許可します SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // http リクエストを作成します (取得モード) HttpGet httpget =新しいHttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("リクエストの実行" + httpget.getRequestLine()); { HttpEntity エンティティ = response.getEntity(); System.out.println("--------------------------------- -------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("応答コンテンツの長さ: " +entity.getContentLength()); (エンティティ)); EntityUtils.consume(エンティティ) } } 最後に {response.close() } ; (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace() } 最後に { if (httpclient != null); { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 投稿モードでフォームを送信します (ユーザーのログイン要求をシミュレートします) */ public void postForm() { // デフォルトの httpClient インスタンスを作成します。 CloseableHttpClient httpclient = HttpClients.createDefault() // httppost を作成します。 HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action") // パラメータキューを作成 List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("username") , "管理者")); formparams.add(new BasicNameValuePair("パスワード", "123456")); UrlEncodedFormEntity uefEntity; try {uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); (httppost); を試してください。 HttpEntity エンティティ = response.getEntity(); if (entity != null) { System.out.println("-------------------------- ------------"); System.out.println("応答内容: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-- ------------------------------------"); } }finally {response.close(); } }キャッチ(ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace() }finally { // 接続を閉じてリソースを解放します。 httpclient .close(); } catch (IOException e) { e.printStackTrace() } } /** *投稿リクエストを送信してローカル アプリケーションにアクセスし、渡されたさまざまなパラメーターに応じてさまざまな結果を返します */ public void post() { // デフォルトの httpClient インスタンスを作成します httpclient = HttpClients.createDefault() // httppost HttpPost httppost; = new HttpPost(" http://localhost:8080/myDemo/Ajax/serivceJ.action");パラメーター キューを作成します。 List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("type", "house")); "); httppost.setEntity(uefEntity); System.out.println("実行中のリクエスト " + httppost.getURI()); CloseableHttpResponse = httpclient.execute(httppost); try { HttpEntity エンティティ = response.getEntity() if (entity != null); .println("------------------------------------------"); .out.println ("応答内容: " + 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 { // 接続を閉じてリソースを解放します try { httpclient.close(); } catch (IOException e) { e.printStackTrace() } } /** * get リクエストを送信します* / public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); // httpget を作成します httpget = new HttpGet("http://www.baidu.com/"); System.out.println("実行リクエスト " + httpget.getURI()) // 取得リクエストを実行します = httpclient.execute(httpget); try { // 応答エンティティを取得する HttpEntity entity = response.getEntity(); ----------"); //応答ステータスを出力する System.out.println(response.getStatusLine()); if (entity != null) { // 応答内容の長さを出力する System.out.println("応答内容の長さ: " +entity.getContentLength()); // 応答内容を出力する System.out.println("応答内容: " + EntityUtils.toString(entity)); System.out.println("----------------------------------------"); } 最後に { 応答 .close(); } } catch (ClientProtocolException e) { e.printStackTrace() } catch (IOException e) { e.printStackTrace(); finally { // 接続を閉じてリソースを解放します 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 コメント = new StringBody("何らかのバイナリ ファイル", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin ", bin).addPart("コメント", コメント).build(); httppost.setEntity(reqEntity); System.out.println("リクエストの実行" + httppost.getRequestLine()); CloseableHttpResponse = httpclient.execute(httppost); ------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = 応答。 getEntity( ); if (resEntity != null) { System.out.println("応答コンテンツの長さ: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } 最後に {response.close() } } catch (ClientProtocolException e); e.printStackTrace(); } catch (IOException e) { e.printStackTrace() } 最後に { httpclient.close(); } catch (IOException e) { e.printStackTrace() } } }</namevaluepair></namevaluepair></namevaluepair>
この例では、最新バージョンの HttpClient4.3 を使用します。このバージョンは以前のコードの書き方とは大きく異なりますので、より注意してください。
さて、以上がこの記事の全内容です。気に入っていただければ幸いです。