如何在 HttpURLConnection 中发送 PUT,DELETE HTTP 请求?

我想知道是否有可能发送 PUT,DELETE 请求(实际上)通过 java.net.HttpURLConnection到基于 HTTP 的 URL。

我已经阅读了很多描述如何发送 GET、 POST、 TRACE、 OPTION 请求的文章,但我仍然没有找到任何成功执行 PUT 和 DELETE 请求的示例代码。

285713 次浏览

要执行 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 删除:

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

UrlConnection 是一个很难使用的 API。到目前为止,HttpClient 是更好的 API,它可以节省您搜索如何实现某些事情的时间,比如这个堆栈溢出问题就很好地说明了这一点。在多个 REST 客户机中使用了 jdk HttpUrlConnection 之后,我编写了这段代码。 此外,当涉及到可伸缩性特性(如线程池、连接池等)时,HttpClient 更胜一筹

我同意@adietsheim 和其他人建议 HttpClient。

我花了一些时间尝试用 HttpURLConnection 调用一个简单的 rest 服务,但它并没有说服我,之后我又用 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
}

要在 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();
}

甚至休息模板也可以是一个选项:

String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?<RequestDAO>....";
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();

有一个简单的方法删除和放置请求,你可以简单地做到这一点,添加一个“ _method”参数到您的文章请求,并写“ PUT”或“ DELETE”的值!