2016-11-24 9 views
5

私は単純なHttpClientプログラムを書こうとしています。 私がHttpClientで作業しているのは初めてですが、どのジャーを含めるのかはかなり混乱しています。利用可能なさまざまなHttpClientの違いは何ですか?

私は、クライアントオブジェクト

package com.comverse.rht; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpException; 
import org.apache.commons.httpclient.HttpStatus; 
import org.apache.commons.httpclient.NameValuePair; 
import org.apache.commons.httpclient.URI; 
import org.apache.commons.httpclient.URIException; 
import org.apache.commons.httpclient.methods.GetMethod; 
import org.apache.commons.httpclient.methods.PostMethod; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 

public class HttpClientTest { 

    public static void main(String[] args) throws URIException { 
     URI url = new URI("http://www.google.com/search?q=httpClient"); 
     HttpClient client = new HttpClient(); 
     GetMethod get = new GetMethod(); 
     PostMethod post = new PostMethod(); 
     String responseString; 
     StringBuilder sb = new StringBuilder(); 
     String line; 

     // add request header 
     get.setURI(url); 
     get.addRequestHeader("User-Agent", "shaiksha429"); 

     try { 
      int respCode = client.executeMethod(get); 
      System.out.println("Response Code:" +respCode); 
      System.out.println(
       "PCRF HTTP Status" + HttpStatus.getStatusText(respCode) 
      ); 
      responseString = get.getResponseBodyAsString(); 
      BufferedReader rd = null; 
      rd = new BufferedReader(
       new InputStreamReader(get.getResponseBodyAsStream()) 
      ); 
      while ((line = rd.readLine()) != null) { 
       sb.append(line + '\n'); 
      } 
      System.out.println(sb); 
     } catch (HttpException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

で異なる方法を参照してくださいしかし、私はグーグルたときに、私は以下のように異なるの例を参照してくださいHttpClientオブジェクトを作成するとき、私はこれらのものとapache-httpcomponents-httpclient.jarorg.apache.commons.httpclient.jarが含まれています。両者の違いは何ですか?なぜHttpClientに「実行」があり、もう1つに「executeMethod」があるのですか?どちらを使用する必要がありますか?

String url = "http://www.google.com/search?q=httpClient"; 
HttpClient client = HttpClientBuilder.create().build(); 
HttpGet request = new HttpGet(url); 
// add request header 
request.addHeader("User-Agent", USER_AGENT); 
HttpResponse response = client.execute(request); 
System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); 
BufferedReader rd = new BufferedReader(
    new InputStreamReader(response.getEntity().getContent()) 
); 
StringBuffer result = new StringBuffer(); 
String line = ""; 
while ((line = rd.readLine()) != null) { 
    result.append(line); 
} 
+0

なぜ最新のバージョンを使用するだけではないのですか? – Andreas

+0

私は、各HttpClientが異なるメソッドセットを持っているいくつかのjarファイルを試しました。 "post"という名前のメソッドがあり、他のメソッドは "PostMethod"という名前のメソッドを持っています – shaiksha

+0

@Andreas:最新バージョンどのような依存関係を含める必要がありますか? – shaiksha

答えて

7

HttpClientバージョン3からバージョン4までには多くの変更がありました.2番目の例はHttpClient 4のものですから、最初の例はおそらく以前のバージョンのものです。ここで

は、まずGoogle検索を行いますコードで、文字列に結果を読ん

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); 
connectionManager.setMaxTotal(60); 
connectionManager.setDefaultMaxPerRoute(6); 

try (CloseableHttpClient client = HttpClients.custom().setConnectionManager(connectionManager).build()) { 

    HttpGet request = new HttpGet("http://www.google.com/search?q=httpClient"); 
    request.setHeader("User-Agent", "HttpClient"); 
    try (CloseableHttpResponse response = client.execute(request)) { 
     MediaType mediaType = MediaType.parseMediaType(response.getFirstHeader("Content-Type").getValue()); 
     Charset charSet = mediaType.getCharSet(); 
     HttpEntity entity = response.getEntity(); 
     InputStream is = entity.getContent(); 
     String body = CharStreams.toString(new InputStreamReader(is, charSet)); 
     System.out.println("body = " + body); 
     EntityUtils.consume(entity); 
    } 
} 

、あなたはおそらく、接続プールを作成したいので、あなたが複数の要求を送信する場合は、接続を再利用することができます同じサーバーに送信します。プールは通常、アプリケーションの初期化中に作成されます(たとえば、SpringシングルトンBeanなど)。

ここで私はClosableHttpClientを使用しました。なぜなら、Resource-try構文で動作し、読んだら、httpClient、レスポンス、およびinputStreamの両方を閉じる必要があるからです。 HttpClientは実際には軽量のオブジェクトであり、ソケット接続やCookieなどの状態は他の場所に格納されます。

私は、charのエンコーディングを取得するためにSpringのMediaType.parseMediaType()を使用し、InputStreamをStringに変換するためにGuavas CharStreamsを使用します。私の場合、googleは "search"が "søgning"であるため、latin-1を使ってコンテンツをデコードしています。

最後のステップは、EntityUtils.consume(エンティティ)を使用して、すべてのエンティティデータが確実に読み取られるようにすることです。接続プールを使用する場合、これは重要です。これは、未読データによって接続マネージャが再利用するのではなく、接続を破棄するためです(これはhttpsを使用している場合は非常に重要です)。

2

あなたの主なバージョンでインターフェイスが変更されたライブラリを使用しています。 jarをコピーしたり、使用しているリリースやサンプルやスニペットがリリースされたリリースを理解することなく、例をコピー&ペーストすることはできません。

最新のリリースに付随するサンプルを見て、古いものを塩の塊で取ります。

Apacheは特に高速に動作するようです。

関連する問題