そのため、Apache HttpComponents 4は、私がこれまでに遭遇した中で最も酷使されたAPIの1つであるという結論に達しました。単純に見えるように思えるのは、数百行のコードを使用することです(そして、私はstillリソースが正しくクリーンアップされるかどうかわかりません)。
さらに、次のようなことをしたいと考えています。
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search",
URLEncodedUtils.format(qparams, "UTF-8"), null);
ただ…いや。私はそれがJavaであることを知っており、私たちは全体を簡潔にすることには興味がありませんが、それは少しだけです。言うまでもなく、jarファイルは最大700KBです。
とにかく、私は他のHTTPクライアントライブラリでどのような経験をしたかを十分に暴言しましたか?
私が知っているものは: Jetty 、 hotpotato 、および AsyncHttpClient です。
これはサーバー側で使用するためのもので、多くの同時取得と大きなファイル転送のパフォーマンスに主に興味があります。
推奨事項はありますか?
PS私は由緒あるHttpClient 3.1がまだそこにあることを知っていますが、サポートされているものを使いたいです。
@oleg:これはドキュメントが示唆するものです:
HttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget = new HttpGet("http://www.Apache.org/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
try {
instream.read();
} catch (IOException ex) {
throw ex;
} catch (RuntimeException ex) {
httpget.abort();
throw ex;
} finally {
try { instream.close(); } catch (Exception ignore) {}
}
}
} finally {
httpclient.getConnectionManager().shutdown();
}
ThreadSafeClientConnManager
を使用しているときにエンティティコンテンツを使用すると、予期しないエラーが発生します。私のせいだと確信していますが、この時点でそれを理解する必要はありません。
ねえ、私はここで誰かの仕事を軽meanするつもりはありませんが、4.0がリリースされて以来、私は誠意を持ってHttpComponentsを使用する努力をしてきました。
これは何らかの理由で復活したので、自分の質問に答えること。
私は Java.net.HttpURLConnection
、最後に私が真剣に考えた時から長い道のりを経ているようです。
Apache HttpComponents は素晴らしいですが、単純なタスクではやり過ぎになる可能性があります。また、少なくとも私のシナリオでは、HUCは著しく高速です(ほとんどがシングルスレッドで、高負荷でテストを行っていません)。
HttpClient APIの複雑さは、単にその問題ドメインの複雑さを反映しています。一般的な誤解に反して、HTTPはかなり複雑なプロトコルです。低レベルのトランスポートライブラリであるHC 4.0 APIは、単純さではなくパフォーマンスと柔軟性のために主に最適化されました。あなたがそれを理解することができないのは残念ですが、そうです。ニーズに最適なライブラリを使用してください。個人的には Jetty HttpClient が大好きです。それはあなたのためによりよく働くかもしれない素晴らしい代替です。
単純な使用例では、 HttpClient Fluent API を使用できます。 チュートリアル を参照してください。
このモジュールは、流れるようなインターフェイスの概念に基づいて、HttpClientの使いやすいファサードAPIを提供します。 Fluent Facade APIは、HttpClientの最も基本的な機能のみを公開し、HttpClientの完全な柔軟性を必要としない単純なユースケースに適しています。たとえば、流れるようなファサードAPIにより、ユーザーは接続管理やリソースの割り当て解除に対処する必要がなくなります。
// Execute a GET with timeout settings and return response content as String.
Request.Get("http://somehost/")
.connectTimeout(1000)
.socketTimeout(1000)
.execute().returnContent().asString();
Mavenアーティファクト。
<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.2.5</version>
</dependency>
別のライブラリは Java用Google HTTPクライアントライブラリ です。
Googleが作成したこのライブラリは、HTTP経由でWeb上のリソースにアクセスするための柔軟で効率的かつ強力なJavaクライアントライブラリです。低レベルのライブラリを可能にするプラグ可能なHTTPトランスポート抽象化を備えていますJava.net.HttpURLConnection、Apache HTTPクライアント、またはGoogle App EngineのURLフェッチなど、使用するHTTP応答および要求コンテンツの解析とシリアル化のための効率的なJSONおよびXMLデータモデルを備えています。また、JacksonおよびJSON用のAndroidのGSONライブラリのサポートを含む、完全にプラグイン可能です。
私は JAX-RS (2.0で標準化)のクライアントAPIと、特にJerseyの実装のファンです。非同期をサポートし、Apache HttpComponents、プレーンなHttpUrlConnection、Jetty、またはGrizzlyに対応できるように connectors を持っています。
使用法の良い例がいくつかあります here には、以下が含まれます。
client.target(REST_SERVICE_URL)
.path("/{bookId}")
.resolveTemplate("bookId", bookId)
.request()
.get(Book.class);
Netty または Apache Mina を使用できますが、それらは非常に低レベルであり、より冗長なコードになるとは思いません。
jsoup は、HTMLファイルを解析するために設計されたライブラリです。 Webページのソースコードを取得するためにHTTP呼び出しを行います。
Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
HTTPUnitには優れたインターフェイスがあります(多くのコードは必要ありません)が、HTTPUnitの最新バージョンは重複したリクエストを送信します。
HTMLUnitは動作しますが、私にとってはJavascriptのサポートが限られているように見えます。ただし、基本的なWebページに使用できました。
Restlet のクライアント機能をご覧ください。これは、たとえばApache HttpComponentsやJavaのNet APIでサポートできる上のレイヤーです。