cURL DELETE in Java



就像标题所说的,我试图在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"示例中不需要这样做,因为读取连接的输入流会使其自动连接。

最新更新