Come inviare PUT, CANCELLARE la richiesta HTTP in HttpURLConnection?

Voglio sapere se è ansible inviare PUT, CANCELLARE la richiesta (praticamente) tramite java.net.HttpURLConnection all’URL basato su HTTP.

Ho letto tanti articoli che descrivono come inviare richieste GET, POST, TRACE, OPTIONS ma non ho ancora trovato alcun codice di esempio che esegua correttamente richieste PUT e DELETE.

Per eseguire un PUT HTTP:

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

Per eseguire un DELETE 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(); 

Ecco come ha funzionato per me:

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

Quindi nel tuo codice:

 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 } 

Sono d’accordo con @adietisheim e il resto delle persone che suggeriscono HttpClient.

Ho passato del tempo cercando di fare una semplice chiamata al servizio di rest con HttpURLConnection e non mi aveva convinto e dopo ho provato con HttpClient ed era davvero più facile, comprensibile e bello.

Un esempio di codice per effettuare una chiamata http put è il seguente:

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

UrlConnection è un’API imbarazzante con cui lavorare. HttpClient è di gran lunga l’API migliore e ti risparmierà dal perdere tempo a cercare come ottenere determinate cose come questa domanda StackOverflow illustra perfettamente. Scrivo questo dopo aver usato il jdk HttpUrlConnection in diversi client REST. Inoltre, quando si tratta di funzionalità di scalabilità (come threadpool, pool di connessioni, ecc.) HttpClient è superiore

Per fare un PUT in HTML correttamente, dovrai circondarlo 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 (MalformsdURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

Consiglierei Apache HTTPClient.

  • Come fare un put.
  • Come fare un DELETE.

Anche il modello di rest può essere un’opzione:

 String payload = "...."; RestTemplate rest = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/xml"); headers.add("Accept", "*/*"); HttpEntity requestEntity = new HttpEntity(payload, headers); ResponseEntity responseEntity = rest.exchange(url, HttpMethod.PUT, requestEntity, String.class); responseEntity.getBody().toString();