怎么通过url向一个restful服务发出delete请求

 我来答
慈冷玉Fo
推荐于2017-09-22 · TA获得超过2.6万个赞
知道大有可为答主
回答量:1.7万
采纳率:0%
帮助的人:7816万
展开全部
DELETE方法是用来删除URL所指定的资源的,作为HTTP协议规定的方法之一,当然可以被使用,只是需要注意下面的一些细节,避免系统设计意外。
1、具体实现上,服务器可能会有自己变通的处理方式,比如出于安全、数据完整性的考虑,把`删除`转义为`禁用`,毕竟删除数据是危险的,需要意识到这一点
2、提交DELETE请求时,不能包含Entity Body。排除传输编码的要求,Entity Body实际上就是HTTP消息体:

The message-body (if any) of an HTTP message is used to carry the entity-body associated with the request or response.
The message-body differs from the entity-body only when a transfer-coding has been applied,

message-body = entity-body
| <entity-body encoded as per Transfer-Encoding>

对于GET/POST/PUT方法,传递Entity Body都不会有问题,但对于DELETE方法,由于该方法传递Entity Body没有明确定义的语义,所以有些服务器实现会丢弃/忽略DELETE请求的entity body,或者拒绝该请求。参见HTTP协议草稿(http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-22#page-28)4.3.5 DELETE章节:

A payload within a DELETE request message has no defined semantics;
sending a payload body on a DELETE request might cause some existing
implementations to reject the request.

注意(过时的)老版本的RFC2616(http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3)里面没有特别说明这一点。

3、PUT/DELETE方法从语义上来讲,对资源是有破坏性的,PUT更改现有的资源,而DELETE摧毁一个资源,带有破坏性质的方法有时候会被防火墙或者IT管理人员特别关注,所以当提供PUT/DELETE接口服务时,需要确保服务器前置的防火墙没有block这些方法。当然如果走的是HTTPS协议,无需担心这一点。

java中使HttpDelete可以发送body信息
RESTful api中用到了DELETE方法,android开发的同事遇到了问题,使用HttpDelete执行DELETE操作的时候,不能携带body信息,研究了很久之后找到了解决方法。 我们查看httpclient-4.2.3的源码可以发现,methods包下面包含HttpGet, HttpPost, HttpPut, HttpDelete等类来实现http的常用操作。 其中,HttpPost继承自HttpEntityEnclosingRequestBase,HttpEntityEnclosingRequestBase类又实现了HttpEntityEnclosingRequest接口,实现了setEntity的方法。 而HttpDelete继承自HttpRequestBase,没有实现setEntity的方法,因此无法设置HttpEntity对象。 这样解决方法就明显了,我们可以自己实现一个MyHttpDelete类,继承自HttpEntityEnclosingRequestBase,覆盖其中的getMethod方法,使其返回“DELETE”。
public class MyHttpDelete extends HttpEntityEnclosingRequestBase {

public static final String METHOD_NAME = "DELETE";

public String getMethod() {
return METHOD_NAME;
}

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

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

public MyHttpDelete() {
super();
}

}

使用delete方法时,直接可以按下面方式操作
DefaultHttpClient httpClient = new DefaultHttpClient();

MyHttpDelete delete = new MyHttpDelete("http://url.com");

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

delete.setEntity(new UrlEncodedFormEntity(nameValuePairs));

HttpResponse response = httpClient.execute(delete);
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式