Bagaimana cara mengirim PUT, HAPUS permintaan HTTP di HttpURLConnection?

132

Saya ingin tahu apakah mungkin untuk mengirim PUT, HAPUS permintaan (praktis) melalui java.net.HttpURLConnectionke URL berbasis HTTP.

Saya telah membaca begitu banyak artikel yang menjelaskan bagaimana cara mengirim permintaan GET, POST, TRACE, OPTIONS tetapi saya masih belum menemukan kode sampel yang berhasil melakukan permintaan PUT dan DELETE.

Matriks
sumber
2
Bisakah Anda menunjukkan kepada kami kode yang Anda coba gunakan?
akarnokd

Jawaban:

177

Untuk melakukan PUT HTTP:

URL url = new URL("http://www.example.com/resource");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestMethod("PUT");
OutputStreamWriter out = new OutputStreamWriter(
    httpCon.getOutputStream());
out.write("Resource content");
out.close();
httpCon.getInputStream();

Untuk melakukan HTTP DELETE:

URL url = new URL("http://www.example.com/resource");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestProperty(
    "Content-Type", "application/x-www-form-urlencoded" );
httpCon.setRequestMethod("DELETE");
httpCon.connect();
Matthew Murdoch
sumber
1
Iya. Semua hal ini dimungkinkan tetapi sangat bergantung pada API yang didukung oleh penyedia email / blog Anda.
Matius Murdoch
5
halo, saya mengalami masalah dengan delete. Ketika saya menjalankan kode ini seperti di sini, tidak ada yang terjadi, permintaan tidak terkirim. Situasi yang sama adalah ketika saya melakukan postpermintaan, tetapi di sana saya dapat menggunakan misalnya httpCon.getContent()yang memicu permintaan. Tapi httpCon.connect()itu tidak memicu apa pun di mesin saya :-)
coubeatczech
7
Dalam contoh di atas, saya yakin Anda harus menghubungi httpCon.getInputStream () di akhir untuk menyebabkan permintaan dikirim.
Eric Smith
3
Saya mendapat "java.net.ProtocolException: DELETE tidak mendukung penulisan"
Kimo_do
1
@edisusanto sumber daya yang disebutkan (ditunjukkan oleh URL) adalah data yang akan dihapus.
Matthew Murdoch
24

Beginilah cara kerjanya untuk saya:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
int responseCode = connection.getResponseCode();
Eli Heifetz
sumber
11
public  HttpURLConnection getHttpConnection(String url, String type){
        URL uri = null;
        HttpURLConnection con = null;
        try{
            uri = new URL(url);
            con = (HttpURLConnection) uri.openConnection();
            con.setRequestMethod(type); //type: POST, PUT, DELETE, GET
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setConnectTimeout(60000); //60 secs
            con.setReadTimeout(60000); //60 secs
            con.setRequestProperty("Accept-Encoding", "Your Encoding");
            con.setRequestProperty("Content-Type", "Your Encoding");
        }catch(Exception e){
            logger.info( "connection i/o failed" );
        }
        return con;
}

Kemudian dalam kode Anda:

public void yourmethod(String url, String type, String reqbody){
    HttpURLConnection con = null;
    String result = null;
    try {
        con = conUtil.getHttpConnection( url , type);
    //you can add any request body here if you want to post
         if( reqbody != null){  
                con.setDoInput(true);
                con.setDoOutput(true);
                DataOutputStream out = new  DataOutputStream(con.getOutputStream());
                out.writeBytes(reqbody);
                out.flush();
                out.close();
            }
        con.connect();
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String temp = null;
        StringBuilder sb = new StringBuilder();
        while((temp = in.readLine()) != null){
            sb.append(temp).append(" ");
        }
        result = sb.toString();
        in.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        logger.error(e.getMessage());
    }
//result is the response you get from the remote side
}
Benjamin Twilight
sumber
Mendapatkan 'java.io.IOException: metode yang tidak didukung: masukkan' inJ2me sdk logger
CodeToLife
8

Saya setuju dengan @adietisheim dan semua orang yang menyarankan HttpClient.

Saya menghabiskan waktu mencoba membuat panggilan sederhana untuk beristirahat layanan dengan HttpURLConnection dan itu tidak meyakinkan saya dan setelah itu saya mencoba dengan HttpClient dan itu benar-benar lebih mudah, dapat dimengerti dan menyenangkan.

Contoh kode untuk melakukan panggilan http put adalah sebagai berikut:

DefaultHttpClient httpClient = new DefaultHttpClient();

HttpPut putRequest = new HttpPut(URI);

StringEntity input = new StringEntity(XML);
input.setContentType(CONTENT_TYPE);

putRequest.setEntity(input);
HttpResponse response = httpClient.execute(putRequest);
Alvaro
sumber
Hanya ingin mengucapkan terima kasih untuk ini. Menghabiskan banyak waktu mencoba untuk mendapatkan kode saya menggunakan HttpURLConnectionuntuk bekerja, tapi terus berlari ke dalam kesalahan aneh, khususnya: cannot retry due to server authentication, in streaming mode. Mengikuti saran Anda berhasil untuk saya. Saya menyadari ini tidak menjawab pertanyaan yang meminta untuk digunakan HttpURLConnection, tetapi jawaban Anda membantu saya.
Tom Catullo
@Sebaliknya gunakan HttpClientBuilder
Waldemar Wosiński
3

UrlConnection adalah API yang aneh untuk digunakan. HttpClient sejauh ini adalah API yang lebih baik dan itu akan membantu Anda dari kehilangan waktu mencari cara untuk mencapai hal-hal tertentu seperti pertanyaan stackoverflow ini menggambarkan dengan sempurna. Saya menulis ini setelah menggunakan jdk HttpUrlConnection di beberapa klien REST. Selain itu ketika datang ke fitur skalabilitas (seperti threadpools, kolam koneksi dll.) HttpClient lebih unggul

Adietisheim
sumber
3

Untuk melakukan PUT dalam HTML dengan benar, Anda harus mengelilinginya dengan try / catch:

try {
    url = new URL("http://www.example.com/resource");
    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setRequestMethod("PUT");
    OutputStreamWriter out = new OutputStreamWriter(
        httpCon.getOutputStream());
    out.write("Resource content");
    out.close();
    httpCon.getInputStream();
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (ProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
Carlos Sirvent
sumber
1

Even Rest Template dapat menjadi pilihan:

String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?<CourierServiceabilityRequest>....";
    RestTemplate rest = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/xml");
    headers.add("Accept", "*/*");
    HttpEntity<String> requestEntity = new HttpEntity<String>(payload, headers);
    ResponseEntity<String> responseEntity =
            rest.exchange(url, HttpMethod.PUT, requestEntity, String.class);

     responseEntity.getBody().toString();
Gloria Rampur
sumber
Ini adalah salah satu jawaban terbaik yang pernah saya lihat di SO.
thonnor
0

ada cara sederhana untuk menghapus dan menempatkan permintaan, Anda bisa melakukannya dengan menambahkan " _method" parameter ke permintaan posting Anda dan menulis " PUT" atau " DELETE" untuk nilainya!

Mohamad Rostami
sumber
-1

Saya akan merekomendasikan Apache HTTPClient.

Clint
sumber
9
Mengapa Anda merekomendasikan HTTPClient? Itu besar. Maksud saya - dalam ukuran.
jayarjo
1
@jayarjo, Ini bagian dari SDK Android.
Zamel
9
@Zamel: Di mana tepatnya Android memasukkan gambar?
talonx
1
@alonx: Saya tidak tahu. Kesalahanku. Saya dimakamkan dalam pengembangan Android karenanya kebingungan.
Zamel
3
Ketika OP mengatakan dengan jelas bahwa HttpUrlConnection harus digunakan, lalu mengapa menggunakan HttpClient?
Tidak Tahu Banyak