पदावनत किए गए 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();
    ...
}

हालाँकि, नेटबीन्स मुझे बताता है कि DefaultHttpClientयह पदावनत है। मैंने DefaultHttpClient deprecatedकई अन्य विविधताओं के लिए गुगली करने की कोशिश की है, जैसा कि मैं सोच सकता हूं और कोई उपयोगी परिणाम नहीं मिल सकता है, इसलिए मैं स्पष्ट रूप से कुछ याद कर रहा हूं।

वेबपेज की सामग्री को डाउनलोड करने का सही जावा 7 तरीका क्या है? क्या वास्तव में भाषा के हिस्से के रूप में कोई सभ्य Http क्लाइंट नहीं है? मेरे लिए इस पर भरोसा करना मुश्किल है।

इसके लिए मेरी मावेन निर्भरता है ...

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

2
NetBeans आपको गलत बता रहा है, या आप कुछ गलत कर रहे हैं। DefaultHttpClientनिश्चित रूप से पदावनत नहीं किया जाता है। आपने अपने POM में कौन सा संस्करण निर्दिष्ट किया है?
धारणा

8
4.3-अल्फा 1 में यह पदावनत होता है
अरुण पी जॉनी

3
आप सही हैं httpclient एपीआई एक ट्रेनव्रेक है
हंस वेस्टेरबेक

2
मैं आपको LATEST के बजाय संस्करण को कुछ प्रमुख रिलीज़ संख्या में सेट करने की सलाह दूंगा। यह आपको मैन्युअल रूप से अपग्रेड प्रक्रिया को नियंत्रित करने और मावेन को आपके लिए तय नहीं करने देगा।
क्रिस्टोफ रूसी

1
@Basic किसी भी समय बदल सकता है जब आप एक नए प्रोजेक्ट में भी इस पर काम करते हैं, तो यह भ्रमित हो सकता है यदि आपने इसे स्वयं सेट नहीं किया है। उदाहरण के लिए यह काम किया और संकलित किया गया और आप कोड का पालन करते हैं। अगले दिन कोई और आता है, चेकआउट करता है और यह भी संकलित नहीं करता है क्योंकि नवीनतम संस्करण बदल गया है। बेशक आप वही करते हैं जो आप चाहते हैं लेकिन मैं इसे इस कारण (संस्करण) के लिए उपयोग करने से बचूंगा।
क्रिस्टोफ रूसो

जवाबों:


259

प्रासंगिक आयात:

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

उपयोग:

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

EDIT (जूल्स के सुझाव के बाद):

जैसा कि build()विधि एक है CloseableHttpClientजो एक-ए है AutoClosable , तो आप घोषणा को संसाधनों के साथ एक बयान में रख सकते हैं (जावा 7+):

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

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

} catch (IOException e) {

    // handle

}

2
आप 4.3 से नीचे के संस्करण का उपयोग कर रहे हैं (और यह अपाचे HTTPClient होना चाहिए, न कि कॉमन्स HTTPClient)
अल्फिश

7
ध्यान दें कि रिटर्न वैल्यू एक है CloseableHttpClient, जिसे आपको उपयोग के बाद बंद कर देना चाहिए। यह लागू होता है AutoCloseable, इसलिए आप जावा 7+ में एक कोशिश के साथ संसाधनों के बयान में इसका उपयोग कर सकते हैं try (CloseableHttpClient httpclient = ...) { ... }:।
जूल्स

2
CloseableHttpClient httpClient = HttpClientBuilder.create ()। Build (); मेरे लिए यह काम
समीर काज़ी

6
प्रश्न: क्या हमें create()स्थैतिक विधि द्वारा लौटे HttpClientBuilder उदाहरण पर पकड़ करनी चाहिए ? या हम सिर्फ कॉल कर सकते हैं create()जब भी हम एक की जरूरत है? ... Btw, import org.apache.http.impl.client.HttpClientBuilderकिसी को जो कि जरूरत के लिए। [नापसंद बयानों के बिना नापसंद जवाब। चिंता मत करो मैं अभी भी :) :)
ADTC

1
@HartmutPfitzinger Android पर OkHttp का उपयोग करता है। उन्होंने एक कांटे वाले Apache Http क्लाइंट के साथ खिलवाड़ किया, जो अब विरासत है।
sschrass 10

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

AutoClosable:

जैसा कि जूल्स ने टिप्पणी में संकेत दिया है, लौटाया गया वर्ग लागू करता है java.io.Closable, इसलिए यदि आप जावा 7 या इसके बाद के संस्करण का उपयोग करते हैं, तो आप यह कर सकते हैं:

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

फायदा यह है कि आपको अंत और नल से निपटने की ज़रूरत नहीं है।

अन्य प्रासंगिक जानकारी

कनेक्शन पूलिंग के बारे में पढ़ना सुनिश्चित करें और टाइमआउट सेट करें ।


11

अपाचे के उदाहरण इसका उपयोग करते हैं:

CloseableHttpClient httpclient = HttpClients.createDefault();

org.apache.http.impl.client.HttpClientsसंस्करण 4.3 के बाद से कक्षा है।

के लिए कोड यहाँ में स्वीकृत उत्तरHttpClients.createDefault() के समान है।


HttpClient क्लाइंट = HttpClients.reateDefault () का उपयोग करते समय "त्रुटि का कारण: java.lang.VerifyError: org / apache / http / conj / ssl / DefaultHostnameVerifier" प्राप्त करें;
एमडी इमरान चौधरी

7

यह संस्करण में पदावनत हो गया 4.3-alpha1जिसका उपयोग आप LATESTसंस्करण विनिर्देश के कारण करते हैं। आप वर्ग के जावाडोक पर एक नज़र डालें, तो यह बताता है कि आप क्या बजाय का उपयोग करें: HttpClientBuilder

नवीनतम स्थिर संस्करण ( 4.2.3) में DefaultHttpClientअभी तक पदावनत नहीं किया गया है।


प्रतिक्रिया के लिए धन्यवाद - Netbeans किसी भी org.apache सामान के लिए कोई JavaDocs नहीं दिखा रहा है - लेकिन मुझे लगता है कि यह एक अलग समस्या है
बेसिक

संभवतः आपके पास पुस्तकालय से जुड़े स्रोत नहीं हैं। मैं नेटबीन का उपयोग नहीं करता, लेकिन मुझे लगता है कि यह निर्भरता के स्रोतों को डाउनलोड करने के लिए कहने का एक तरीका है।
झागी

7

jcabi-httpउदाहरण के लिए, एक धाराप्रवाह जावा 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

मैं नीचे दी गई विधि का उपयोग करने का सुझाव दूंगा यदि आप केवल जोंस डेटा पढ़ने की कोशिश कर रहे हैं।

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कि पदावनत किया जाता है और आप अपने उत्तर में इसका उपयोग करने का सुझाव देते हैं ...
बेसिक

वैकल्पिक दृष्टिकोण के लिए धन्यवाद। मैं पहले ही तीखे जवाब के साथ जा चुका हूं, लेकिन यह हल्का-फुल्का लगता है कि मैं इसे अगली बार आजमाऊंगा।
बेसिक

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

आप निम्नलिखित मावेन निर्भरता जोड़ सकते हैं।

    <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>

आप अपने जावा कोड में निम्नलिखित आयात का उपयोग कर सकते हैं।

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;

आप अपने जावा कोड में निम्नलिखित कोड ब्लॉक का उपयोग कर सकते हैं।

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

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

उत्तर देने के लिए समय निकालने के लिए धन्यवाद, लेकिन यह स्वीकार किए गए उत्तर से कैसे अलग है?
बेसिक

1
अधिकांश उत्तर psuedo कोड हैं, मैंने मावेन निर्भरता के साथ Apache HTTP क्लाइंट एपीआई के साथ एंड-टू-एंड बेसिक वर्किंग जावा कोड करने की कोशिश की। हालांकि महान कुछ भी नहीं।
रेड बॉय

1

यह वह समाधान है जो मैंने उस समस्या पर लागू किया है जिसे httpclient ने एंड्रॉइड 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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.