더 이상 사용되지 않는 Java HttpClient-얼마나 어려울 수 있습니까?


172

내가하려고하는 일은 JSON을 다운로드하여 직렬화 해제하는 것입니다. 아직 JSON을 다운로드하는 것까지 멀지 않았습니다.

아파치 사이트의 예제를 포함하여 찾을 수있는 거의 모든 단일 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하고 내가 생각할 수있는 다른 많은 변형을 시도했지만 유용한 결과를 찾을 수 없으므로 분명히 뭔가를 놓치고 있습니다.

웹 페이지의 컨텐츠를 다운로드하는 올바른 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에서는 더 이상 사용되지 않는 것 같습니다
Arun P Johny

3
당신은 바로 HttpClient를 API는 열차 사고가 있습니다
한스 Westerbeek

2
최신 버전 대신 일부 주요 릴리스 번호로 버전을 설정하는 것이 좋습니다. 이를 통해 업그레이드 프로세스를 수동으로 제어 할 수 있으며 Maven은 사용자를 대신 결정하지 않습니다.
Christophe Roussy

1
@ 기본은 새 프로젝트에서도 작업하는 동안 언제든지 변경 될 수 있습니다. 직접 설정하지 않으면 혼란 스러울 수 있습니다. 예를 들어 작동하고 컴파일되었으며 코드를 커밋합니다. 다른 사람이 다음날 도착하고 체크 아웃하며 최신 버전이 변경되어 컴파일조차하지 않습니다. 물론 당신은 당신이 원하는 것을하지만이 이유 (버전 관리)를 사용하지 않을 것입니다.
Christophe Roussy

답변:


259

관련 수입품 :

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

용법:

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

편집 (Jules의 제안 후) :

는 AS build()메소드가 리턴 CloseableHttpClient하는 것입니다-A는 AutoClosable , 당신은 시도 -과 - 자원 문 (자바 7+)의 선언을 배치 할 수 있습니다 :

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, 사용 후 닫아야합니다. AutoCloseableJava 7+의 try-with-resources 문에서 사용할 수 있도록을 구현 try (CloseableHttpClient httpclient = ...) { ... }합니다.
Jules

2
CloseableHttpClient httpClient = HttpClientBuilder.create (). build (); 이 작업은 나를 위해
Sameer Kazi

6
질문 :create() 정적 메서드에서 반환 한 HttpClientBuilder 인스턴스를 유지해야합니까 ? 또는 우리는 단지 호출 할 수 있습니다 create()우리가 하나가 필요할 때마다? ..., BTW import org.apache.http.impl.client.HttpClientBuilder이 필요 누군가를 위해. [가져 오기 설명없이 답변을 싫어합니다. 내가 여전히 upvoted 걱정하지 마십시오 :)]
ADTC

1
@HartmutPfitzinger는 Android에서 OkHttp를 사용합니다. 그들은 갈래의 Apache Http Client를 망쳤습니다.
sschrass

59

IMHO는 정답을 맞지만 정답을 찾는 방법을 설명하지 않기 때문에 '교육'을 놓치게됩니다. 더 이상 사용되지 않는 클래스의 경우 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()) {...}

장점은 finally 및 null을 처리 할 필요가 없다는 것입니다.

기타 관련 정보

또한 연결 풀링 에 대해 읽고 시간 제한을 설정하십시오 .


11

Apache의 예제는 다음을 사용합니다.

CloseableHttpClient httpclient = HttpClients.createDefault();

org.apache.http.impl.client.HttpClients4.3 버전부터 클래스 가 있습니다.

의 코드 는 여기에 허용 된 답변HttpClients.createDefault() 과 동일 합니다.


HttpClient client = HttpClients.createDefault (); 사용시 오류 : "java.lang.VerifyError : org / apache / http / conn / ssl / DefaultHostnameVerifier"오류가 발생합니다.
Md Imran Choudhury

7

버전 사양으로 4.3-alpha1인해 사용중인 버전에서 더 이상 사용되지 않습니다 LATEST. 클래스의 javadoc을 살펴보면 대신 사용할 것을 알려줍니다 HttpClientBuilder.

최신 안정 버전 ( 4.2.3)에서는 DefaultHttpClient아직 사용되지 않습니다.


응답에 감사드립니다-Netbeans는 org.apache에 대한 JavaDocs를 표시하지 않습니다. 그러나 다른 문제라고 생각합니다.
Basic

라이브러리에 소스가 첨부되어 있지 않을 수 있습니다. Netbeans를 사용하지 않지만 종속성 소스를 다운로드하도록 요청할 수있는 방법이 있다고 생각합니다.
zagyi


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은 더 이상 사용되지 않으며 답변에 사용하는 것이 좋습니다 ...
Basic

다른 접근 방식에 감사드립니다. 나는 이미 정답을 가지고 갔지만 다음에 시도해 볼만큼 가벼워 보입니다.
기본

2

사용 HttpClientBuilder을 빌드하는 HttpClient를 대신 사용 DefaultHttpClient을

전의:

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

 // Prepare a request object
 HttpGet httpget = new HttpGet("http://www.apache.org/");

new HttpClientBuilder()그렇지 HttpClientBuilder.create()않습니까?
ADTC

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 Client API를 사용하여 엔드 투 엔드 기본 작업 Java 코드를 maven 종속성과 함께 시도했습니다. 그래도 좋은 것은 없습니다.
레드 보이

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.