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

내가하려고하는 일은 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>



답변

관련 수입품 :

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

}


답변

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을 처리 할 필요가 없다는 것입니다.

기타 관련 정보

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


답변

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

CloseableHttpClient httpclient = HttpClients.createDefault();

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

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


답변

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

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


답변

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


답변

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


답변

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

전의:

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

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