Come inviare PUT, ELIMINARE la richiesta HTTP in HttpURLConnection?


132

Voglio sapere se è possibile inviare la richiesta PUT, DELETE (praticamente) java.net.HttpURLConnectionall'URL basato su HTTP.

Ho letto così tanti articoli che descrivono come inviare richieste GET, POST, TRACE, OPTIONS ma non ho ancora trovato alcun codice di esempio che esegua correttamente le richieste PUT e DELETE.


2
Puoi mostrarci il codice che hai provato a usare?
Akarnokd,

Risposte:


177

Per eseguire un 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();

Per eseguire una CANCELLAZIONE HTTP:

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
Sì. Tutte queste cose sono possibili ma dipendono davvero dall'API supportata dal tuo provider di posta / blog.
Matthew Murdoch,

5
ciao, sto avendo problemi con il delete. Quando eseguo questo codice così com'è, non succede nulla, la richiesta non viene inviata. La stessa situazione è quando sto facendo postrichieste, ma lì posso usare per esempio httpCon.getContent()che innesca la richiesta. Ma il httpCon.connect()non fa scattare nulla nella mia macchina :-)
coubeatczech,

7
Negli esempi sopra, credo che dovrai chiamare httpCon.getInputStream () alla fine per far sì che la richiesta venga effettivamente inviata.
Eric Smith,

3
Ho ricevuto "java.net.ProtocolException: DELETE non supporta la scrittura"
Kimo_do

1
@edisusanto la risorsa denominata (indicata dall'URL) sono i dati che verranno eliminati.
Matthew Murdoch,

24

Ecco come ha funzionato per me:

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

Quindi nel tuo codice:

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
}

Ottenere 'java.io.IOException: metodo non supportato: put' inJ2me logger sdk
CodeToLife

8

Sono d'accordo con @adietisheim e il resto delle persone che suggeriscono HttpClient.

Ho trascorso del tempo cercando di fare una semplice chiamata per riposare il servizio con HttpURLConnection e non mi aveva convinto e dopo ho provato con HttpClient ed è stato davvero più facile, comprensibile e carino.

Un esempio di codice per effettuare una chiamata http put è il seguente:

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

Volevo solo dire grazie per questo. Trascorso molte ore cercando di ottenere il mio codice utilizzando HttpURLConnectional lavoro, ma continuò a correre in un errore strano, in particolare: cannot retry due to server authentication, in streaming mode. Seguire il tuo consiglio ha funzionato per me. Mi rendo conto che questo non risponde esattamente alla domanda, che chiede di usare HttpURLConnection, ma la tua risposta mi ha aiutato.
Tom Catullo,

@ Uso obsoleto HttpClientBuilder invece
Waldemar Wosiński

3

UrlConnection è un'API scomoda con cui lavorare. HttpClient è di gran lunga l'API migliore e ti risparmierà di perdere tempo a cercare come ottenere determinate cose come questa domanda di StackOverflow illustra perfettamente. Scrivo questo dopo aver usato il jdk HttpUrlConnection in diversi client REST. Inoltre, quando si tratta di funzionalità di scalabilità (come threadpools, pool di connessioni, ecc.) HttpClient è superiore


3

Per eseguire correttamente un PUT in HTML, dovrai circondarlo con 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();
}

1

Anche il modello di riposo può essere un'opzione:

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

Questa è una delle migliori risposte che ho visto su SO.
giovedì

0

c'è un modo semplice per cancellare e mettere la richiesta, puoi semplicemente farlo aggiungendo un " _method" parametro alla tua richiesta di post e scrivere " PUT" o " DELETE" per il suo valore!


-1

Consiglierei Apache HTTPClient.


9
Perché consiglieresti HTTPClient? È enorme. Voglio dire - in termini di dimensioni.
jayarjo,

1
@jayarjo, fa parte dell'SDK di Android.
Zamel

9
@Zamel: dove entra esattamente l'immagine Android?
Talonx,

1
@talonx: non ne ho idea. Errore mio. Sono stato sepolto nello sviluppo di Android, quindi la confusione.
Zamel

3
Quando l'OP ha affermato chiaramente che è necessario utilizzare HttpUrlConnection, quindi perché utilizzare HttpClient?
Non sa molto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.