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

132

Je veux savoir s'il est possible d'envoyer une requête PUT, DELETE (pratiquement) via java.net.HttpURLConnectionune URL basée sur 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 qui exécute avec succès les requêtes PUT et DELETE.

Matrice
la source
2
Pouvez-vous nous montrer le code que vous avez essayé d'utiliser?
akarnokd le

Réponses:

177

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 une SUPPRESSION 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();
Matthieu Murdoch
la source
1
Oui. Toutes ces choses sont possibles mais dépendent vraiment de l'API prise en charge par votre fournisseur de messagerie / blog.
Matthew Murdoch
5
bonjour, j'ai des problèmes avec le delete. Quand j'exécute ce code tel qu'il est ici, rien ne se passe vraiment, la requête n'est pas envoyée. La même situation est lorsque je fais des postrequêtes, mais là je peux utiliser par exemple httpCon.getContent()ce qui déclenche la requête. Mais le httpCon.connect()ne déclenche rien dans ma machine :-)
coubeatczech
7
Dans les exemples ci-dessus, je pense que vous devrez appeler httpCon.getInputStream () à la fin pour que la requête soit effectivement envoyée.
Eric Smith
3
J'ai "java.net.ProtocolException: DELETE ne prend pas en charge l'écriture"
Kimo_do
1
@edisusanto la ressource nommée (indiquée par l'URL) est la donnée qui sera supprimée.
Matthew Murdoch
24

Voici comment cela a fonctionné pour moi:

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

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
}
Benjamin Twilight
la source
Obtenir 'java.io.IOException: méthode non prise en charge: put' inJ2me sdk logger
CodeToLife
8

Je suis d'accord avec @adietisheim et le reste des personnes 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 put http:

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
la source
Je voulais juste vous remercier pour cela. Nous avons passé de nombreuses heures à essayer d'obtenir mon code à l' aide HttpURLConnectionau travail, mais rencontrais une erreur bizarre, en particulier: cannot retry due to server authentication, in streaming mode. Suivre vos conseils a fonctionné pour moi. Je me rends compte que cela ne répond pas exactement à la question, qui demande à utiliser HttpURLConnection, mais votre réponse m'a aidé.
Tom Catullo
@Deprecated utilise HttpClientBuilder à la place
Waldemar Wosiński
3

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

Adietisheim
la source
3

Pour faire correctement un PUT en HTML, 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();
}
Carlos Sirvent
la source
1

Même le 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();
Gloria Rampur
la source
C'est l'une des meilleures réponses que j'ai vues sur SO.
thonnor le
0

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

Mohamad Rostami
la source
-1

Je recommanderais Apache HTTPClient.

Clint
la source
9
Pourquoi recommanderiez-vous HTTPClient? C'est énorme. Je veux dire - en taille.
jayarjo
1
@jayarjo, cela fait partie du SDK Android.
Zamel
9
@Zamel: Où exactement Android entre-t-il dans l'image?
talonx
1
@talonx: Je n'en ai aucune idée. Mon erreur. J'ai été enterré dans le développement Android d'où la confusion.
Zamel
3
Lorsque l'OP a clairement indiqué que HttpUrlConnection devait être utilisé, alors pourquoi utiliser HttpClient?
Ne sait pas grand-