studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java httpurlconnection put http-delete

java - para - manual de programacion android pdf



¿Cómo enviar PUT, ELIMINAR solicitud HTTP en HttpURLConnection? (8)

Deseo saber si es posible enviar solicitudes PUT, DELETE (prácticamente) a través de java.net.HttpURLConnection a URL basada en HTTP.

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.


Así es como funcionó para mí:

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


Estoy de acuerdo con @adietisheim y el resto de 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 a http 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);


Incluso la plantilla de descanso 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();


Para hacer un PUT en HTML correctamente, tendrá 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(); }


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



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 ilustra perfectamente. Escribo esto después de haber usado jdk HttpUrlConnection en varios clientes REST. Además, cuando se trata de características de escalabilidad (como grupos de subprocesos, grupos de conexiones, etc.) HttpClient es superior


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