2009-06-26 24 views
112

Deseo saber si es posible enviar solicitudes PUT, DELETE (prácticamente) a través de java.net.HttpURLConnection a una URL HTTP.¿Cómo enviar PUT, ELIMINAR solicitud HTTP en HttpURLConnection?

He leído tantos artículos que describen cómo enviar solicitudes GET, POST, TRACE, OPTIONS pero aún no he encontrado ningún código de muestra que realice satisfactoriamente solicitudes PUT y DELETE.

+2

nos muestras el código que ha intentado usar? – akarnokd

Respuesta

150

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

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

Entonces, ¿es posible que al usar el código de java pueda eliminar el correo de su cuenta de correo (utilizando el método DELETE) o mediante el método de publicación pueda crear documentos (digamos como blogs)? – Matrix

+0

o ¿Es posible enviar imagen/video/audio al servidor usando el método POST? – Matrix

+1

Sí. Todas estas cosas son posibles, pero realmente dependen de la API compatible con su proveedor de correo/blog. –

19

Ésta es la forma en que Trab ked para mí:

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

UrlConnection es una API incómoda para trabajar. HttpClient es de lejos la mejor API y le evitará perder tiempo buscando cómo lograr ciertas cosas, como esta pregunta de stackoverflow ilustra perfectamente. Escribo esto después de haber usado jdk HttpUrlConnection en varios clientes REST. Por otra parte, cuando se trata de características de escalabilidad (como threadpools, almacenes de conexiones etc.) HttpClient es superior

7

Estoy de acuerdo con @adietisheim y el resto de las personas que sugieren HttpClient.

Pasé un tiempo tratando de hacer un simple servicio de call to rest con HttpURLConnection y no me había convencido y luego lo intenté con HttpClient y fue realmente más fácil, comprensible y agradable.

Un ejemplo de código para realizar una llamada HTTP PUT es el siguiente:

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

Solo quería agradecerle por esto. Pasé muchas horas intentando que mi código utiliza 'HttpURLConnection' para funcionar, pero seguí corriendo en un extraño error, específicamente:' no puedo volver a intentarlo debido a la autenticación del servidor, en modo de transmisión '. Seguir tu consejo funcionó para mí. Me doy cuenta de que esto no responde exactamente la pregunta, que pide usar 'HttpURLConnection', pero tu respuesta me ayudó. –

+0

@Deprecated usa HttpClientBuilder en su lugar –

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

Luego en el código:

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

Para hacer un PUT en HTML correctamente, se tiene que rodearlo 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(); 
} 
0
Incluso

Resto plantilla puede ser una opción:

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