我目前正在针对基于 DropWizard 的 REST API 应用程序编写单元测试。我正在测试的端点有两种添加和删除对象属性的方法。POST 调用创建属性,DELETE 调用可以删除它。我可以提交带有标识该属性的表单数据的 POST 请求。我在提交包含标识该属性的表单数据的 DELETE 请求时遇到问题。要提交 POST,我使用:
Client client = new JerseyClientBuilder(RULE.getEnvironment())
.build(String.format("test client %d", _id));
_id++;
return client.target("http://localhost:5000/Object/12345/Property")
.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE), Response.class);
Run Code Online (Sandbox Code Playgroud)
这按预期工作。但是,JerseyInitation.Builder 对象的 DELETE 相关方法似乎缺少传递定义表单参数的实体对象的方法。如果我尝试使用较低级别的 .method() 函数:
Client client = new JerseyClientBuilder(RULE.getEnvironment()).build(String.format("test client %d", _id));
_id++;
return client.target("http://localhost:5000/Object/12345/Property")
.request(MediaType.APPLICATION_JSON_TYPE)
.method("DELETE",
Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE),
Response.class);
Run Code Online (Sandbox Code Playgroud)
我收到这个完全无益的异常:
java.lang.IllegalStateException: Entity must be null for http method DELETE.
Run Code Online (Sandbox Code Playgroud)
我对 HTTP 规范的理解(以及 stackoverflow 的共识:是否允许 HTTP DELETE 请求使用实体主体?)表明带有 DELETE 的消息主体完全符合标准,尽管某些实现任意决定阻止这一点。泽西岛似乎是这些有限的实现之一。解决这个问题的理想的最小努力的解决方法是什么?(假设 DropWizard 应用程序是不可变的,“只需重写 REST API 以不使用 DELETE 或使用不同的 REST URI …
我想删除使用 http post 创建的标签。这是我尝试过的代码。
$http({
method: 'DELETE',
url: '/api/tags',
data: [vm.tags.name]
}).success(function(data) {
console.log('Gets DELETED');
vm.tags.name = data;
}).error(function(data) {
console.log('Does not get DELETED');
});
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,它只发送一个带有 [null] 的数组。那么这里有什么我没有看到或理解的东西。我的意思是,如果 POST 有效,它应该与 DELETE 以相同的方式工作,对吗?顺便说一下,它显示了日志“Gets DELETED”,但没有这样做。
我有一个外部API,它使用DELETE与body(JSON).我使用Postman REST Client并使用请求体完成删除,它工作正常.我正在尝试使用方法自动执行此功能.
我尝试了类似的GET,POST和PUT的HttpURLConnection.但我不知道如何将DELETE与请求体一起使用.
我已经检查了StackOverflow,看到这是无法完成的,但它们是非常古老的答案.
有人可以帮忙吗?我正在使用spring框架.
如果在何时/何时不使用上述将信息传递给REST调用的方法,我一直试图找到答案.
我一直在寻找各地,但每个帖子只讨论两种列出的方法之间的差异,或3,而不是所有4.