web-dev-qa-db-fra.com

Comment envoyer une requête HTTP PUT, DELETE dans HttpURLConnection?

Je souhaite savoir s'il est possible d'envoyer (pratiquement) une requête PUT, DELETE via Java.net.HttpURLConnection à une URL HTTP.

J'ai lu tellement d'articles décrivant comment envoyer des requêtes GET, POST, TRACE, OPTIONS mais je n'ai toujours pas trouvé d'exemple de code permettant d'exécuter les requêtes PUT et DELETE.

121
Matrix

Pour effectuer un HTTP PUT:

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

Pour effectuer un 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();
165
Matthew Murdoch

Voici comment cela a fonctionné pour moi:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
int responseCode = connection.getResponseCode();
22
Eli Heifetz
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;
}

Puis dans votre code:

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
}
10
Benjamin Twilight

Je suis d'accord avec @adietisheim et le reste des gens qui suggèrent HttpClient.

J'ai passé du temps à essayer de faire un simple appel au service de repos avec HttpURLConnection et cela ne m'avait pas convaincu et après cela, j'ai essayé avec HttpClient et c'était vraiment plus facile, compréhensible et agréable.

Voici un exemple de code pour effectuer un appel http put:

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

UrlConnection est une API difficile à utiliser. HttpClient est de loin la meilleure API et vous évitera de perdre du temps à chercher des moyens de réaliser certaines choses comme l'illustre parfaitement cette question de stackoverflow. J'écris ceci après avoir utilisé jdk HttpUrlConnection dans plusieurs clients REST . En outre, en ce qui concerne les fonctionnalités d'évolutivité (telles que les pools de threads, les pools de connexions, etc.), HttpClient est supérieur.

3
adietisheim

Pour faire un PUT en HTML correctement, vous devrez l’entourer de 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();
}
3
Carlos Sirvent

il existe un moyen simple de supprimer et de mettre une requête, vous pouvez simplement le faire en ajoutant un paramètre "_method" à votre requête de publication et en écrivant "PUT" ou "DELETE" pour sa valeur!

0
Mohamad Rostami

Même modèle de repos peut être une option:

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();
0
Gloria Rampur

Je recommanderais Apache HTTPClient. 

0
Clint