অবহেলিত জাভা এইচটিপিপিলেট - এটি কতটা কঠিন হতে পারে?


172

আমি যা করার চেষ্টা করছি তা হ'ল কিছু জেএসওএন ডাউনলোড করে এটি কোনও বস্তুতে ডিসরিয়ালাইজ করা। আমি এখনও জেএসএন ডাউনলোড করার মতো জায়গা পাইনি।

প্রায় প্রতিটি একক এইচটিটিপি ক্লায়েন্ট উদাহরণটি আমি খুঁজে পেতে পারি, এপাচি সাইটের অন্তর্ভুক্ত এমন কিছু দেখাচ্ছে ...

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

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

যাইহোক, নেটবিয়ান আমাকে বলে যে DefaultHttpClientএটি হ্রাস করা হয়েছে। আমি গুগল করার চেষ্টা করেছি DefaultHttpClient deprecatedএবং অন্যান্য বিভিন্ন প্রকারের হিসাবে আমি ভাবতে পারি এবং কোনও কার্যকর ফলাফল খুঁজে পাচ্ছি না, তাই আমি অবশ্যই কিছু অনুভব করছি।

কোনও ওয়েবপৃষ্ঠার বিষয়বস্তু ডাউনলোড করার সঠিক জাভা 7 কী? ভাষার অংশ হিসাবে আসলেই কি কোনও শালীন এইচটিপিপি ক্লায়েন্ট নেই? আমি দেখলাম এটাতে বিশ্বাস করা কঠিন.

এর জন্য আমার মাভেন নির্ভরতা হ'ল ...

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

2
নেটবিয়ান আপনাকে ভুল বলছে, বা আপনি কিছু ভুলভাবে পড়ছেন। DefaultHttpClientস্পষ্টতই হ্রাস করা হয় না। আপনি আপনার POM এ কোন সংস্করণ উল্লেখ করেছেন?
অনুমান

8
৪.৩-আলফা ১ এ এটি অবমানিত বলে মনে হচ্ছে
অরুণ পি জনি

3
আপনি ঠিক বলেছেন HTTP ক্লায়েন্ট এপিআই ট্রেনের ধ্বংস
হান্স ওয়েস্টারবিক

2
আমি আপনাকে সুপারিশ করব লেটস্টের পরিবর্তে সংস্করণটি কিছু বড় রিলিজ নম্বরটিতে সেট করুন। এটি আপনাকে ম্যানুয়ালি আপগ্রেড প্রক্রিয়াটি নিয়ন্ত্রণ করতে দেয় এবং মাভেনকে আপনার জন্য সিদ্ধান্ত নিতে দেয় না।
ক্রিস্টোফ রাউসি

1
@ বেসিক এটি আপনি যখন কোনও নতুন প্রকল্পে কাজ করার সময় এটি যে কোনও সময় পরিবর্তিত হতে পারে, আপনি নিজে সেট না করে থাকলে এটি বিভ্রান্তিকর হতে পারে। উদাহরণস্বরূপ এটি কাজ করেছে এবং সংকলিত হয়েছে এবং আপনি কোডটি প্রতিশ্রুতিবদ্ধ। পরের দিন অন্য কেউ উপস্থিত হয়, চেকআউট করে এবং এটি এমনকি সংকলন করে না কারণ সর্বশেষ সংস্করণটি পরিবর্তিত হয়েছিল। অবশ্যই আপনি যা চান তা করেন তবে আমি এ কারণে এটি ব্যবহার করা এড়াতে চাই (সংস্করণকরণ)।
ক্রিস্টোফ রাউসি

উত্তর:


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()পদ্ধতিটি CloseableHttpClientযেটি একটি-এ হিসাবে দেয় AutoClosable, আপনি এই ঘোষণাটি একটি সংস্থান-সংস্থান-বিবৃতিতে (জাভা 7+) রাখতে পারেন:

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

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

} catch (IOException e) {

    // handle

}

2
আপনি ৪.৩ এর নীচে সংস্করণ ব্যবহার করছেন (এবং এটি অ্যাপাচি HTTPClient হওয়া উচিত, কমন্স HTTPClient নয়)
আলফিশ

7
নোট করুন যে রিটার্ন মানটি হ'ল CloseableHttpClient, যা আপনাকে ব্যবহারের পরে বন্ধ করা উচিত। এটা তোলে প্রয়োগ AutoCloseable, তাই আপনি জাভা 7+ করে দেখুন-সঙ্গে-সম্পদ বিবৃতিতে এটা ব্যবহার করতে পারেন: try (CloseableHttpClient httpclient = ...) { ... }
জুলাই

2
ক্লোজযোগ্যএইচটিপিপ্লিয়েন্ট httpClient = HttpClientBuilder.create ()। বিল্ড (); আমার জন্য এই কাজ
সমীর কাজী

6
প্রশ্ন: আমাদের কি create()স্থির পদ্ধতিতে ফিরে আসা এইচটিপিপিলেট ব্লেন্ডার উদাহরণটি ধরে রাখা উচিত ? বা create()যখনই আমাদের প্রয়োজন হবে আমরা কেবল কল করতে পারি ? ... বিটিডব্লিউ, import org.apache.http.impl.client.HttpClientBuilderযার যে এর প্রয়োজন হয় for [আমদানির বিবৃতি ছাড়াই উত্তরগুলি অপছন্দ করে। চিন্তিত হবেন না আমি এখনও
উপড়ে ফেলেছি

1
@ হার্টমুটফিজ্টিজার অ্যান্ড্রয়েডে OkHttp ব্যবহার করুন। তারা একটি কাঁটাযুক্ত অ্যাপাচি এইচটিপি ক্লায়েন্টের সাথে গণ্ডগোল করেছে, এটি এখন উত্তরাধিকার।
sschrass

59

আইএমএইচও গ্রহণযোগ্য উত্তরটি সঠিক তবে কিছু 'শিক্ষণ' মিস করেছে কারণ এটি কীভাবে উত্তরটি নিয়ে আসবে তা ব্যাখ্যা করে না। সমস্ত অবহেলিত শ্রেণীর জন্য দেখুন জাভাডকের(যদি আপনার এটি না হয় ডাউনলোড করুন বা অনলাইনে যান ), এটি পুরানো কোডটি প্রতিস্থাপনের জন্য কোন শ্রেণিতে ব্যবহার করতে হবে তা ইঙ্গিত করবে। অবশ্যই এটি আপনাকে সব কিছু বলবে না, তবে এটি একটি শুরু। উদাহরণ:

...
 *
 * @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সংস্করণ ৪.৩ থেকে রয়েছে।

কোডটি এখানে গৃহীত উত্তরHttpClients.createDefault() হিসাবে একই ।


ত্রুটি পান "এর দ্বারা সৃষ্ট: java.lang.VerifError: org / apache / HTTP / conn / ssl / DefaultHostnameVerifier" যখন HTTPClient ক্লায়েন্ট = HTTPClients.createDefault () ব্যবহার করবেন;
মোঃ ইমরান চৌধুরী

7

সংস্করণ নির্দিষ্টকরণের 4.3-alpha1কারণে আপনি যে LATESTসংস্করণটি ব্যবহার করেন এটি এটিকে হ্রাস পেয়েছে । আপনি যদি ক্লাসের জাভাদোকটি একবার দেখুন, এটি পরিবর্তে কী ব্যবহার করবেন তা আপনাকে বলে:HttpClientBuilder

সর্বশেষতম স্থিতিশীল সংস্করণে ( 4.2.3) DefaultHttpClientএখনও অবচয় হয় না।


প্রতিক্রিয়াটির জন্য ধন্যবাদ - নেটবিন কোনও org.apache স্টাফের জন্য কোনও জাভাডকস দেখাচ্ছে না - তবে আমি মনে করি এটি অন্যরকম সমস্যা
বেসিক

আপনার কাছে সম্ভবত গ্রন্থাগারের সাথে সংযুক্ত উত্স নেই। আমি নেটবিন ব্যবহার করি না, তবে আমার অনুমান যে নির্ভরতার উত্সগুলি ডাউনলোড করতে এটি জিজ্ঞাসা করার একটি উপায় আছে।
জাগি

7

চেষ্টা করুন jcabi-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

ডিফল্টএইচটিপিপ্লায়েন্ট ব্যবহারের পরিবর্তে এইচটিটিপিপ্লিনেন্ট তৈরি করতে এইচটিপসিপ্লিয়েন্টবিল্ডার ব্যবহার করুন

উদা:

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

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

কেন new HttpClientBuilder()এবং না HttpClientBuilder.create()?
এডিটিসি

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
উত্তরগুলির বেশিরভাগই স্যুইডো কোডগুলি হয়, আমি অ্যাভচি এইচটিটিপি ক্লায়েন্ট এপিআই সহ মাভেন নির্ভরতার সাথে একটি শেষ থেকে শেষ বুনিয়াদী জাভা কোড করার চেষ্টা করেছি। দুর্দান্ত কিছু না।
রেড বয়

1

এই সমাধানটিই আমি সেই সমস্যার জন্য প্রয়োগ করেছি যে অ্যান্ড্রয়েড 22 এর এই সংস্করণে httpclient অবনতি হয়েছে

 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.