2009-06-26 8 views
112

Je veux savoir s'il est possible d'envoyer PUT, DELETE demande (pratiquement) par java.net.HttpURLConnection URL HTTP.Comment envoyer PUT, SUPPRIMER une requête HTTP dans HttpURLConnection?

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 effectue avec succès les requêtes PUT et DELETE.

+2

Pouvez-vous nous montrer le code que vous avez essayé d'utiliser? – akarnokd

Répondre

1

Je recommande Apache HTTPClient.

+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

150

Pour effectuer une requête 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 requête 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(); 
+0

Donc, est-il possible qu'en utilisant le code java, vous pouvez supprimer le courrier de votre compte de messagerie (en utilisant la méthode DELETE) ou en utilisant la méthode post, vous pouvez créer un document (disons comme des blogs.)? – Matrix

+0

ou Est-il possible d'envoyer une image/vidéo/audio au serveur en utilisant la méthode POST? – Matrix

+1

Oui. Toutes ces choses sont possibles mais dépendent vraiment de l'API supportée par votre fournisseur de messagerie/blog. –

19

Voici comment WOR ked pour moi:

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

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

7

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 j'ai essayé avec HttpClient et c'était vraiment plus facile, compréhensible et agréable.

Un exemple de code pour faire un appel mis http est la suivante:

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

Je voulais juste vous dire merci. J'ai passé de nombreuses heures à essayer d'obtenir mon code en utilisant 'HttpURLConnection' pour fonctionner, mais j'ai continué à courir dans une erreur bizarre, en particulier:' ne peux pas réessayer à cause de l'authentification du serveur, en mode streaming. Suite à votre conseil a travaillé pour moi. Je réalise que cela ne répond pas exactement à la question, qui demande d'utiliser 'HttpURLConnection', mais votre réponse m'a aidé. –

+0

@Deprecated utiliser HttpClientBuilder à la place –

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

Pour faire correctement un PUT en HTML, vous allez doit l'entourer avec 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(); 
} 
0

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