非推奨のJava HttpClient-どれほど難しいか


172

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

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

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ページのコンテンツをダウンロードする正しいJava7の方法は何ですか?言語の一部としてまともなHttpクライアントは本当にありませんか?それを信じるのは難しいと思います。

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

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
    <type>jar</type>
</dependency>

2
NetBeansが間違っている、または何かを誤解している。DefaultHttpClient絶対に非推奨ではありません。POMで指定したバージョンは何ですか?
Perception

8
4.3-alpha1では非推奨になっているようです
アルンPジョニー2013年

3
そうです、httpclient APIは列車事故です
Hans Westerbeek

2
最新のバージョンではなく、メジャーリリース番号にバージョンを設定することをお勧めします。これにより、アップグレードプロセスを手動で制御できるようになり、Mavenが判断する必要がなくなります。
Christophe Roussy 2014年

1
@Basic新しいプロジェクトでも、作業中にいつでも変更される可能性があります。自分で設定しなかった場合、混乱を招く可能性があります。たとえば、動作してコンパイルされ、コードをコミットします。他の誰かが翌日に到着し、チェックアウトします。最新バージョンが変更されたため、コンパイルも行われません。もちろん、あなたはあなたがやりたいことをしますが、私はこの理由でそれを使うことを避けます(バージョン管理)。
Christophe Roussy 2014年

回答:


259

関連するインポート:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;

使用法:

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

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

build()メソッドがis a CloseableHttpClientを返すので、宣言をtry-with-resourcesステートメントに配置できます(Java 7以降)。 AutoClosable

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

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

} catch (IOException e) {

    // handle

}

2
4.3より前のバージョンを使用している(Commons HTTPClientではなくApache HTTPClientである必要がある)
Alfishe

7
戻り値はでありCloseableHttpClient、使用後に閉じる必要があることに注意してください。これはを実装AutoCloseableしているので、Java 7以降のtry-with-resourcesステートメントで使用できますtry (CloseableHttpClient httpclient = ...) { ... }
ジュール、

2
CloseableHttpClient httpClient = HttpClientBuilder.create()。build(); この作品は私にとって
Sameer Kazi 2014年

6
質問:create()静的メソッドによって返されたHttpClientBuilderインスタンスを保持する必要がありますか?それとも、create()必要なときにいつでも電話をかけることができますか?...必要な人のimport org.apache.http.impl.client.HttpClientBuilderために。[インポート文のない回答は嫌いです。私がまだ賛成していることを心配しないでください:)]
ADTC

1
@HartmutPfitzingerはAndroidでOkHttpを使用します。彼らはフォークされたApache Http Clientを台無しにしてしまいました。
sschrass 2016年

59

私見受け入れられた答えは正しいですが、それは答えを思いつく方法を説明していないので、いくつかの「教える」ことを逃します。廃止予定のすべてのクラスで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();

AutoClosable:

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

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

利点は、finallyとnullを処理する必要がないことです。

その他の関連情報

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


11

Apacheの例はこれを使用します:

CloseableHttpClient httpclient = HttpClients.createDefault();

クラスorg.apache.http.impl.client.HttpClientsはバージョン4.3以降にあります。

のコードHttpClients.createDefault()は、ここで受け入れられた回答と同じです。


HttpClient client = HttpClients.createDefault();を使用すると、「原因:java.lang.VerifyError:org / apache / http / conn / ssl / DefaultHostnameVerifier」というエラーが発生する
Md Imran Choudhury 2017

7

バージョン仕様の4.3-alpha1ため、使用するバージョンでは非推奨になりましたLATEST。クラスのjavadocを見ると、代わりに何を使用するかがわかりますHttpClientBuilder

最新の安定バージョン(4.2.3)では、これDefaultHttpClientはまだ非推奨ではありません。


回答いただきありがとうございます-Netbeansはorg.apacheに関するJavaDocsを表示していません-しかし、それは別の問題だと思います
基本的な

ライブラリに接続されているソースがない可能性があります。私はNetbeansを使用していませんが、依存関係のソースをダウンロードするように依頼する方法があると思います。
zagyi 2013年

7

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


4

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();

質問にDefaultHttpClientは非推奨であり、回答でそれを使用することをお勧めします...
基本的な

別のアプローチをありがとう。私はすでにacdeptedの回答を使っていますが、これは軽量なので、次回は試してみることにします。
基本的な


2

次の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);

お時間を割いていただきありがとうございますが、これは受け入れられた回答とどう違うのですか?
基本的な

1
答えのほとんどは疑似コードであり、Apache HTTPクライアントAPIとMaven依存関係を使用して、エンドツーエンドの基本的な作業Javaコードを実行してみました。素晴らしいことは何もありません。
Red Boy

1

これは、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;
    }
}

-2

元の問題については、以下のロジックを適用するように要求します。

 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
 HttpPost httpPostRequest = new HttpPost();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.