如何在HttpURLConnection中发送PUT,DELETE HTTP请求?
我想知道是否有可能通过java.net.HttpURLConnection
发送PUT,DELETE请求(实际上)到基于HTTP的URL。
我已经阅读了很多文章描述如何发送GET,POST,TRACE,OPTIONS请求,但是我仍然没有find任何成功执行PUT和DELETE请求的示例代码。
执行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();
执行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();
这是如何为我工作的:
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("DELETE"); int responseCode = connection.getResponseCode();
我同意@adietisheim和build议HttpClient的其他人。
我花了一段时间试图做一个简单的电话来rest服务与HttpURLConnection,它没有说服我,之后,我尝试了与HttpClient,这是真的更容易,可以理解,更好。
进行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);
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; }
然后在你的代码中:
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 }
UrlConnection是一个尴尬的API工作。 HttpClient是迄今为止更好的API,它会免除你的时间寻找如何实现某些东西,像这个完美的stackoverflow问题说明。 我在几个REST客户端中使用了jdk HttpUrlConnection后写了这个。 此外,当涉及到可伸缩性function(如线程池,连接池等)HttpClient是优越的
为了正确地在HTML中执行PUT,你必须用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(); }
我会推荐Apache HTTPClient。
- 如何做一个PUT。
- 如何做一个删除。
甚至rest模板可以是一个选项:
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();