HttpURLConnection'da PUT, DELETE HTTP isteği nasıl gönderilir?


132

java.net.HttpURLConnectionHTTP tabanlı URL'ye PUT, DELETE isteği (pratik olarak) göndermenin mümkün olup olmadığını bilmek istiyorum .

GET, POST, TRACE, OPTIONS isteklerinin nasıl gönderileceğini açıklayan çok sayıda makale okudum, ancak yine de PUT ve DELETE isteklerini başarıyla gerçekleştiren herhangi bir örnek kod bulamadım.


2
Kullanmaya çalıştığınız kodu bize gösterebilir misiniz?
akarnokd

Yanıtlar:


177

HTTP PUT gerçekleştirmek için:

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

HTTP SİLME gerçekleştirmek için:

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

1
Evet. Tüm bunlar mümkündür, ancak gerçekten posta / blog sağlayıcınız tarafından desteklenen API'ye bağlıdır.
Matthew Murdoch

5
merhaba, ile sorunlar yaşıyorum delete. Bu kodu burada olduğu gibi çalıştırdığımda gerçekten hiçbir şey olmuyor, istek gönderilmiyor. Aynı durum postistekler yaptığım zamandır, ancak orada örneğin httpCon.getContent()isteği tetikleyen kullanabilirim . Ama httpCon.connect()makinemde hiçbir şeyi tetiklemez :-)
coubeatczech

7
Yukarıdaki örneklerde, isteğin gerçekten gönderilmesi için sonunda httpCon.getInputStream () 'i çağırmanız gerekeceğine inanıyorum.
Eric Smith

3
"Java.net.ProtocolException: DELETE yazmayı desteklemiyor"
mesajını aldım

1
@edisusanto isimli kaynak (URL ile gösterilir) silinecek veridir.
Matthew Murdoch

24

Benim için şu şekilde çalıştı:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
int responseCode = connection.getResponseCode();

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

Sonra kodunuzda:

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
}

'Java.io.IOException: desteklenmeyen yöntem: put' inJ2me sdk logger
CodeToLife

8

@Adietisheim'a ve HttpClient'i öneren diğer kişilere katılıyorum.

HttpURLConnection ile dinlenme servisine basit bir çağrı yapmak için zaman harcadım ve beni ikna etmemişti ve bundan sonra HttpClient ile denedim ve gerçekten daha kolay, anlaşılır ve güzeldi.

Put http çağrısı yapmak için bir kod örneği aşağıdaki gibidir:

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

Sadece bunun için teşekkür etmek istedim. Kullanarak kodumu almaya çalışırken saatlerce Geçirilen HttpURLConnectionişe, ancak özellikle, bir tek hatayla karşılaşıyorsanız tuttu: cannot retry due to server authentication, in streaming mode. Tavsiyene uymak benim için çalıştı. Bunun kullanılmasını isteyen soruyu tam olarak cevaplamadığını biliyorum HttpURLConnection, ancak cevabınız bana yardımcı oldu.
Tom Catullo

@Deprecated bunun yerine HttpClientBuilder'ı kullanın
Waldemar Wosiński

3

UrlConnection, çalışmak için garip bir API'dir. HttpClient açık ara daha iyi bir API'dir ve sizi bu stackoverflow sorusunun mükemmel şekilde gösterdiği gibi belirli şeyleri nasıl başaracağınızı ararken zaman kaybetmekten kurtarır. Bunu birkaç REST istemcisinde jdk HttpUrlConnection'ı kullandıktan sonra yazıyorum. Ayrıca ölçeklenebilirlik özellikleri söz konusu olduğunda (iş parçacığı havuzları, bağlantı havuzları vb.) HttpClient üstündür


3

HTML'de bir PUT yapmak için, onu try / catch ile çevrelemeniz gerekir:

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

1

Dinlenme Şablonu bile bir seçenek olabilir:

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

Bu, SO'da gördüğüm en iyi cevaplardan biri.
thonnor

0

silme ve koyma isteği için basit bir yol vardır, bunu _methodgönderi isteğinize bir " " parametresi ekleyerek ve değeri için " PUT" veya " DELETE" yazarak yapabilirsiniz !


-1

Apache HTTPClient'i tavsiye ederim.


9
HTTPClient'i neden önerirsiniz? Çok büyük. Yani - boyut olarak.
jayarjo

1
@jayarjo, Android SDK'nın bir parçasıdır.
Zamel

9
@Zamel: Android resmin tam olarak neresine giriyor?
talonx

1
@talonx: Hiçbir fikrim yok. Benim hatam. Android geliştirmeye gömüldüm, bu yüzden kafa karışıklığı.
Zamel

3
OP, HttpUrlConnection'ın kullanılması gerektiğini açıkça söylediğinde, neden HttpClient kullanılmalı?
Çok değil bilir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.