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เลิกใช้แล้ว ฉันลองใช้ Google DefaultHttpClient deprecatedและรูปแบบอื่น ๆ มากมายเท่าที่ฉันจะนึกออกและไม่สามารถหาผลลัพธ์ที่เป็นประโยชน์ได้ฉันจึงขาดอะไรบางอย่างไป

วิธีที่ถูกต้องของ Java7 ในการดาวน์โหลดเนื้อหาของหน้าเว็บคืออะไร? Http Client นั้นไม่มีภาษาที่ดีเลยใช่ไหม ฉันพบว่ามันยากที่จะเชื่อ

การพึ่งพา Maven ของฉันสำหรับสิ่งนี้คือ ...

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

2
NetBeans กำลังบอกคุณผิดหรือคุณกำลังอ่านอะไรผิดไป DefaultHttpClientไม่คัดค้านอย่างแน่นอน คุณระบุเวอร์ชันใดใน POM ของคุณ
การรับรู้

8
ใน 4.3-alpha1 ดูเหมือนว่าจะเลิกใช้แล้ว
Arun P Johny

3
คุณพูดถูก httpclient API เป็น trainwreck
Hans Westerbeek

2
ฉันอยากจะแนะนำให้คุณตั้งค่าเวอร์ชั่นเป็นหมายเลขรีลีสหลักแทน LATEST สิ่งนี้จะช่วยให้คุณสามารถควบคุมกระบวนการอัปเกรดด้วยตนเองและไม่อนุญาตให้ 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();

แก้ไข (หลังจากข้อเสนอแนะของจูลส์):

ในฐานะที่เป็นbuild()วิธีการส่งกลับCloseableHttpClientซึ่งเป็นแบบ AutoClosableคุณสามารถวางประกาศในลองกับทรัพยากรคำสั่ง (Java 7+) นี้:

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

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

} catch (IOException e) {

    // handle

}

2
คุณกำลังใช้เวอร์ชั่นต่ำกว่า 4.3 (และควรเป็น Apache HTTPClient ไม่ใช่ Commons HTTPClient)
Alfishe

7
โปรดทราบว่าค่าส่งคืนคือ a CloseableHttpClientซึ่งคุณควรปิดหลังจากใช้งาน จะดำเนินการAutoCloseableเพื่อให้คุณสามารถใช้งานได้ในงบลองกับทรัพยากรในชวา try (CloseableHttpClient httpclient = ...) { ... }7+:
จูลส์

2
CloseableHttpClient httpClient = HttpClientBuilder.create (). build (); งานนี้สำหรับฉัน
Sameer Kazi

6
คำถาม:เราควรยึดอินสแตนซ์ HttpClientBuilder ที่ส่งคืนโดยcreate()วิธีสแตติกหรือไม่ หรือเราจะโทรหาcreate()เมื่อไรก็ได้ที่ต้องการ ... Btw import org.apache.http.impl.client.HttpClientBuilderสำหรับทุกคนที่ต้องการสิ่งนั้น [ไม่ชอบคำตอบที่ไม่มีคำสั่งนำเข้า ไม่ต้องกังวลฉันยัง upvote :)]
ADTC

1
@HartmutPfitzinger ใช้ OkHttp บน Android พวกเขายุ่งกับ 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();

AutoClosable:

ดังที่จูลส์บอกไว้ในความคิดเห็นคลาสที่ส่งคืนจะถูกนำไปใช้java.io.Closableดังนั้นหากคุณใช้ Java 7 หรือสูงกว่าคุณสามารถทำได้ดังนี้:

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

ข้อดีคือคุณไม่ต้องจัดการกับในที่สุดและโมฆะ

ข้อมูลอื่น ๆ ที่เกี่ยวข้อง

นอกจากนี้ยังให้แน่ใจว่าจะอ่านเกี่ยวกับการเชื่อมต่อร่วมกันและการตั้งค่าหมดเวลา


11

ตัวอย่างจาก Apacheใช้สิ่งนี้:

CloseableHttpClient httpclient = HttpClients.createDefault();

คลาสorg.apache.http.impl.client.HttpClientsนี้มีตั้งแต่เวอร์ชัน 4.3

รหัสสำหรับHttpClients.createDefault()เหมือนกับคำตอบที่ยอมรับได้ที่นี่


รับข้อผิดพลาด "เกิดจาก: java.lang.VerifyError: org / apache / http / conn / ssl / DefaultHostnameVerifier" เมื่อใช้ไคลเอ็นต์ HttpClient = HttpClients.createDefault ();
Md Imran Choudhury

7

มันเลิกใช้แล้วในเวอร์ชั่น4.3-alpha1ที่คุณใช้เนื่องจากLATESTข้อกำหนดของเวอร์ชั่น หากคุณดู javadoc ของชั้นเรียนมันจะบอกคุณว่าควรใช้อะไรแทน: HttpClientBuilder.

ในเวอร์ชั่นล่าสุดที่มีเสถียรภาพ ( 4.2.3) ยังDefaultHttpClientไม่เลิกใช้


ขอบคุณสำหรับการตอบกลับ - Netbeans ไม่แสดง JavaDocs ใด ๆ สำหรับสิ่ง org.apache ใด ๆ - แต่ฉันคิดว่านั่นเป็นปัญหาที่แตกต่าง
พื้นฐาน

คุณอาจไม่ได้แนบแหล่งข้อมูลไว้ในไลบรารี ฉันไม่ได้ใช้ Netbeans แต่ฉันคิดว่ามีวิธีที่จะขอให้ดาวน์โหลดแหล่งที่มาของการอ้างอิง
zagyi

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เลิกใช้แล้วและคุณแนะนำให้ใช้ในคำตอบของคุณ ...
พื้นฐาน

ขอบคุณสำหรับวิธีการอื่น ฉันได้ตอบไปแล้ว แต่คำตอบนี้ดูเบาพอที่จะลองอีกครั้ง
พื้นฐาน


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
คำตอบส่วนใหญ่เป็นรหัส psuedo ฉันพยายามทำโค้ด Java พื้นฐานแบบ end-to-end ที่ทำงานร่วมกับ Apache HTTP Client API พร้อมกับการพึ่งพา maven ไม่มีอะไรที่ดีแม้ว่า
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.