ton*_*nga 10 java rest jax-rs jersey
我在Jersey 2.x中有以下服务器端代码:
@Path("/store/remove/from/group")
@DELETE
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public Response removeStoresFromGroup(@FormParam("storeName") List<String> storeNames, @FormParam("groupName") String groupName) {
//......
}
Run Code Online (Sandbox Code Playgroud)
在客户端,我想使用Jersey 2.x客户端向上述Web服务发送删除请求.但是,从Jersey客户端API的文档中,我没有找到如何在DELETE请求中包含以下数据:
WebTarget webTarget = client.target("/store/remove/from/group");
MultivaluedMap<String, String> formData = new MultivaluedHashMap<String, String>();
List<String> storeName = new ArrayList<String>();
storeName.add("Store1");
storeName.add("Store2");
storeName.add("Store3");
formData.addAll("storeName", storeName);
formData.add("groupName", "Group A");
Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).delete(); //The delete() method doesn't take any entity body in the request.
Run Code Online (Sandbox Code Playgroud)
从Jersey客户端API,SyncInvoker该类不支持将delete实体主体作为其参数的方法.所以我只能使用POST或PUT将数据发送到服务器,如下所示(但不是DELETE):
Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).post(Entity.form(formData));
Run Code Online (Sandbox Code Playgroud)
但我想使用DELETE请求,因为请求正在删除一些资源.如何通过Jersey客户端发送带有一些实体数据的DELETE请求?
小智 23
基于Jersey 2.18版本中的代码,该类JerseyInvocation使用预定义的HashMap来验证HTTP方法及其实体,如下所示:
map.put("DELETE", EntityPresence.MUST_BE_NULL);
map.put("GET", EntityPresence.MUST_BE_NULL);
...
Run Code Online (Sandbox Code Playgroud)
这就是为什么我们得到这个错误"对于http方法DELETE,实体必须为null".
虽然,请注意它还提供了一个Jersey客户端配置属性ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION来确定是否停止其余的执行,因此我们可以使用此属性来禁止验证,以便继续DELETE使用Entity 发送请求.例如
ClientConfig config = new ClientConfig();
config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
Client client = ClientBuilder.newClient(config);
...
Run Code Online (Sandbox Code Playgroud)
需要注意的是:如果您使用resteasy实现JAX RS Client API,您可以使用build().invoke():
client.target("$baseUrl$restEndPoint/$entityId")
.request("application/json")
.build("DELETE", Entity.entity(entity, MediaType.APPLICATION_JSON))
.invoke()
Run Code Online (Sandbox Code Playgroud)
但它不起作用 jersey
严格禁止DELETE带有实体主体的A ,但是这种情况很少见,并且被某些框架/服务器忽略。实体主体的需求可能表明未按预期使用a 。DELETE
例如:如果a GET /customers/4711返回一位客户,而您在该资源上发送了DELETE /customers/4711下一位客户,则GET应该返回a 404。您删除的资源通过URL识别像在规范中定义。
您的URL /store/remove/from/group似乎无法识别资源。使用诸如/store/4711或之类的标识符/groups/4711并DELETE在其上发送标识符并不符合您的需求,因为您想“从组中删除商店”而不是删除商店或组。
假设您有一个小组资源
{
"id" : 4711,
"stores" : [123, 456, 789]
}
Run Code Online (Sandbox Code Playgroud)
而你想要一个像
{
"id" : 4711,
"stores" : [123, 789]
}
Run Code Online (Sandbox Code Playgroud)
您没有删除任何内容。您正在修改资源PUT,POST或者PATCH是适当的方法。JSON-Patch是描述此类更改的好格式。请求如下所示:
PATCH /groups/4711 HTTP/1.1
Content-Type: application/json-patch
[
{
"op" : "remove"
"path" : "stores/1"
}
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22958 次 |
| 最近记录: |