web-dev-qa-db-ja.com

廃止予定のJava HttpClient - それがどれほど難しいのか?

私がやろうとしているのは、いくつかのJSONをダウンロードしてそれをオブジェクトに逆シリアル化することです。私はまだJSONをダウンロードすることができませんでした。

Apacheサイトにあるものも含めて、私が見つけることができるほとんどすべてのHttpClientの例は、次のようになります。

import org.Apache.http.client.HttpClient;
import org.Apache.http.impl.client.DefaultHttpClient;

public void blah() {
    HttpClient client = new DefaultHttpClient();
    ...
}

しかし、NetbeansはDefaultHttpClientは廃止予定であると言っています。私はDefaultHttpClient deprecatedや他にもたくさんのバリエーションを試してみて、役に立つ結果が得られないので試してみました。明らかに何かが足りません。

Webページのコンテンツをダウンロードするための正しいJava 7の方法は何ですか?その言語の一部として、まともなHttp Clientが本当にないのでしょうか。それを信じるのは難しいと思います。

これに対する私のMavenの依存関係は...

<dependency>
    <groupId>org.Apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
    <type>jar</type>
</dependency>
161
Basic

関連する輸入品:

import org.Apache.http.impl.client.CloseableHttpClient;
import org.Apache.http.impl.client.HttpClientBuilder;
import Java.io.IOException;

使用法:

HttpClient httpClient = HttpClientBuilder.create().build();

編集(ジュールの提案後):

build()メソッドはCloseableHttpClientを返しますis-aAutoClosableなので、宣言をリソース付きのステートメントに配置できます(Java 7+)。

try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {

    // use httpClient (no need to close it explicitly)

} catch (IOException e) {

    // handle

}
246

私見受け入れられた答えは正しいですがそれが答えを思いつく方法を説明しないのでいくつかの「教え」を逃します。すべての非推奨クラスについては、 JavaDoc (ダウンロードしていない場合、または オンラインにする)を参照してください。 )、それは古いコードを置き換えるためにどのクラスを使うべきかを示唆します。もちろん、それはあなたにすべてを伝えるわけではありませんが、これは始まりです。例:

...
 *
 * @deprecated (4.3) use {@link HttpClientBuilder}.  <----- THE HINT IS HERE !
 */
@ThreadSafe
@Deprecated
public class DefaultHttpClient extends AbstractHttpClient {

ビルダーインスタンスを取得するためのコンストラクタがないため、使用するクラスはHttpClientBuilderになります。代わりに静的メソッドを使用する必要があります。 create。ビルダーが完成したら、ほとんどのビルダーにはビルドメソッドがあると推測できます。

org.Apache.http.impl.client.HttpClientBuilder.create().build();

オートクローズ:

Julesがコメントで示唆したように、返されたクラスはJava.io.Closableを実装しています。そのため、Java 7以上を使っていれば、次のことができます。

    try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {...}

利点は、最後に対処する必要がないこととnullです。

その他の関連情報

また、 接続プール について読み、 タイムアウト を設定してください。

56

Apacheからの例これを使ってください:

HttpClient httpclient = HttpClients.createDefault();

クラスorg.Apache.http.impl.client.HttpClientsはバージョン4.3以降にあります。 HttpClients.createDefault()のコードは、ここで受け入れられている答えと同じです。

10
IvanRF

jcabi-http を試してください。これは流暢なJava HTTPクライアントです。例えば:

String html = new JdkRequest("https://www.google.com")
  .header(HttpHeaders.ACCEPT, MediaType.TEXT_HTML)
  .fetch()
  .as(HttpResponse.class)
  .assertStatus(HttpURLConnection.HTTP_OK)
  .body();

このブログ記事もチェックしてください。 http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

7
yegor256

LATESTバージョンの仕様により、使用するバージョン4.3-alpha1では推奨されません。クラスのJavadocを見ると、代わりに何を使うべきかがわかります:HttpClientBuilder

最新の安定版(4.2.3)では、DefaultHttpClientはまだ非推奨ではありません。

7
zagyi

あなたがJSONデータのみを読もうとしているならば、私は以下の方法を使用することを提案するでしょう。

URL requestUrl=new URL(url);
URLConnection con = requestUrl.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb=new StringBuilder();
int cp;
try {
    while((cp=rd.read())!=-1){
    sb.append((char)cp);
  }
 catch(Exception e){
 }
 String json=sb.toString();
3
Anubhab

次のMaven依存関係を追加することもできます。

    <dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.Apache.httpcomponents/httpmime -->
    <dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.5.1</version>
    </dependency>

あなたのJavaコードでは以下のインポートを使うことができます。

import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.methods.HttpGett;
import org.Apache.http.impl.client.HttpClientBuilder;
import org.Apache.http.client.methods.HttpUriRequest;

あなたのJavaコードで以下のコードブロックを使うことができます。

HttpClient client = HttpClientBuilder.create().build();
HttpUriRequest httpUriRequest = new HttpGet("http://example.domain/someuri");

HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);
2
Red Boy

これは、httpclientがこのバージョンのAndroid 22で非推奨になった問題に私が適用した解決策です。

 public static String getContenxtWeb(String urlS) {
    String pagina = "", devuelve = "";
    URL url;
    try {
        url = new URL(urlS);
        HttpURLConnection conexion = (HttpURLConnection) url
                .openConnection();
        conexion.setRequestProperty("User-Agent",
                "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
        if (conexion.getResponseCode() == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(conexion.getInputStream()));
            String linea = reader.readLine();
            while (linea != null) {
                pagina += linea;
                linea = reader.readLine();
            }
            reader.close();

            devuelve = pagina;
        } else {
            conexion.disconnect();
            return null;
        }
        conexion.disconnect();
        return devuelve;
    } catch (Exception ex) {
        return devuelve;
    }
}
1
Frutos Marquez

DefaultHttpClientを使用する代わりに HttpClient を作成するには HttpClientBuilder を使用します。

例:

MinimalHttpClient httpclient = new HttpClientBuilder().build();

 // Prepare a request object
 HttpGet httpget = new HttpGet("http://www.Apache.org/");
1
Arun P Johny