2017-04-05 54 views
0

我有一个外部API,它使用DELETE和正文(JSON)。我利用邮递员REST客户端并使用请求正文完成删除,并且工作正常。我正在尝试使用一种方法来自动化此功能。带请求正文的Java HTTP DELETE

我试过类似的GET,POST和PUT的HttpURLConnection。但我不确定如何在请求主体中使用DELETE。

我检查了StackOverflow,看到这不能完成,但他们是非常古老的答案。

有人可以帮忙吗?我正在使用spring框架。

+1

这对你有帮助吗? http://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request。看来用DELETE,请求体应该被忽略。 – jrook

+0

我已阅读过那篇文章,但是,我使用的外部API必须具有正文 – DXBKing

+0

这是哪个第三方API?它是由第三方产品使用的第三方API,还是由您正在开发的产品使用的第三方API?在前一种情况下,您几乎坚持使用它,但在后一种情况下,您的组织可以选择使用具有更常见(更好支持)语法的库。 – shoover

回答

2

我用org.apache.http来完成这件事。

@NotThreadSafe 
class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase { 
    public static final String METHOD_NAME = "DELETE"; 

    public String getMethod() { 
     return METHOD_NAME; 
    } 

    public HttpDeleteWithBody(final String uri) { 
     super(); 
     setURI(URI.create(uri)); 
    } 

    public HttpDeleteWithBody(final URI uri) { 
     super(); 
     setURI(uri); 
    } 

    public HttpDeleteWithBody() { 
     super(); 
    } 
} 



public String[] sendDelete(String URL, String PARAMS, String header) throws IOException { 
    String[] restResponse = new String[2]; 
     CloseableHttpClient httpclient = HttpClients.createDefault(); 

     HttpDeleteWithBody httpDelete = new HttpDeleteWithBody(URL); 
     StringEntity input = new StringEntity(PARAMS, ContentType.APPLICATION_JSON); 
     httpDelete.addHeader("header", header); 
     httpDelete.setEntity(input); 

     Header requestHeaders[] = httpDelete.getAllHeaders(); 
     CloseableHttpResponse response = httpclient.execute(httpDelete); 
     restResponse[0] = Integer.toString((response.getStatusLine().getStatusCode())); 
     restResponse[1] = EntityUtils.toString(response.getEntity());  
     return restResponse; 
    } 
} 
+0

得到了答案从 https://daweini.wordpress.com/2013/12/20/apache-httpclient-send-entity-body-in-a-http-delete-请求/ – DXBKing

1

如果您使用的是Spring,则可以使用RestTemplate来生成客户端请求。在这种情况下,您可以使用RestTemplate.exchange并提供url,http方法和请求正文。喜欢的东西(未测试,但你的想法):

RestTemplate restTemplate = new RestTemplate(); 
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar")); 
restTemplate.exchange(url, HttpMethod.DELETE, request, null); 
+0

这会丢下身体,总是返回400 –

0

此代码为我工作: -

  • 您可以通过httpCon.setRequestProperty
  • 您设定由请求方法设置内容类型httpCon.setRequestMethod
  • 写JSON身体成OutputStreamWriter,我的样品中,我使用杰克逊ObjectMapper

    转换Java对象JSON