就像标题所说的,我试图在Java中编写以下curl DELETE
命令。
curl -X DELETE -H "Content-Type: application/json; charset=UTF-8" http://10.84.14.2:8082/virtual-network/47a91732-629b-4cbe-9aa5-45ba4d7b0e99
我的理解是,你必须格式化POST
内部的DELETE
请求。下面是我的GET
调用的工作代码。
URL dc0ContrailUrl2 = new URL("http://10.10.10.120:8082/network-policy/363bf699-6417-486e-9791-d5aaf873d9bb");
URLConnection dcConn2 = dc0ContrailUrl2.openConnection();
dcConn2.setRequestProperty("Content-Type", "application/json");
BufferedReader in2 = newBufferedReader(newInputStreamReader(dcConn2.getInputStream()));
String inputLine2;
while ((inputLine2 = in2.readLine()) != null){ //while response is not null, assign response to inputLine and print inputLine
System.out.println(inputLine2);
}
in2.close();
当我四处寻找如何处理DELETE
请求时,我最终得到了以下内容:
URL url3 = new URL("http://10.10.10.120:8082/network-policy/363bf699-6417-486e-9791-d5aaf873d9bb");
HttpURLConnection httpConnection3 = (HttpURLConnection) url3.openConnection();
httpConnection3.setDoOutput(true);
httpConnection3.setRequestProperty("Content-Type", "application/json" );
httpConnection3.setRequestMethod("DELETE");
在这一点上,我已经走了这么远的谷歌兔子洞,我确信解决方案是非常简单的,只是改变一些语法/方法调用的问题。如有任何帮助,不胜感激。
注意:我能够得到DELETE
调用工作使用邮差(chrome应用程序)通过简单地输入URL http://10.10.10.120:8082/network-policy/363bf699-6417-486e-9791-d5aaf873d9bb
,并切换下拉菜单到DELETE
,所以我知道我的URL不是问题。
不是直接使用HttpURLConnection
,而是尝试使用Apache HttpComponents中的HttpClient库,这是如何与删除命令一起使用它的示例:
void sendDelete() throws IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
// create DELETE REQUEST
HttpDelete httpDelete = new HttpDelete(
"http://10.84.14.2:8082/virtual-network/47a91732-629b-4cbe-9aa5-45ba4d7b0e99");
// add header "content-type"
httpDelete.addHeader(new BasicHeader("Content-Type", "application/json; charset=UTF-8"));
// send request
CloseableHttpResponse response1 = httpclient.execute(httpDelete);
// close response (ideally inside a finally clause in a try/catch)
response1.close();
}
我的理解是,你必须在
POST
中格式化DELETE
请求。
这是错误的。你发布的Curl命令执行一个"DELETE"请求,在这个意义上,POST和DELETE(和GET)是HTTP请求的替代"方法"。有些web服务可能会以POST和/或GET请求的形式接受某种删除命令,但Curl不是这样做的。(这也不是什么邮差正在做当你选择'DELETE'请求方法)
你的代码实际上是非常正确的。指定要进行输出是没有用的(因为不是这样),因此指定content -type也是没有用的(因为请求没有内容),但是这样做可能没有什么害处。您甚至可以在连接上设置setDoInput(false)
,因为您通常不会期望服务器在其响应中发送任何内容,但是忽略它也应该是可以的。
您缺少的主要内容是对连接的connect()
方法的调用。在"GET"示例中不需要这样做,因为读取连接的输入流会使其自动连接。