如何在Jersey客户端的DELETE请求中发送封装数据? - java

我在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) {
    //......
}

在客户端,我想使用Jersey 2.x客户端向上述Web服务发送删除请求。但是,从Jersey client 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.

从Jersey客户端API中, SyncInvoker 类不支持以实体主体作为其参数的delete方法。因此,我只能使用POST或PUT将数据发送到服务器,如下所示(但不能用于DELETE):

Response response = webTarget.request().accept(MediaType.TEXT_PLAIN).post(Entity.form(formData)); 

但是我想使用DELETE请求,因为该请求正在删除一些资源。如何通过Jersey客户端发送带有某些实体数据的DELETE请求?

参考方案

带有实体主体is not strictly forbidden的DELETE,但它非常罕见,并且被某些框架/服务器忽略。实体主体的需求可能表明未按预期使用DELETE

例如:如果GET /customers/4711返回一个客户,而您发送了DELETE /customers/4711,则该资源上的下一个GET应该返回404。您删除了由defined in the spec之类的URL 标识的资源

您的URL /store/remove/from/group似乎无法标识资源。使用诸如/store/4711/groups/4711之类的标识符并在其上发送DELETE将不符合您的需求,因为您想“从组中删除商店”而不是删除商店或组。

假设您有一个小组资源

{
  "id" : 4711,
  "stores" : [123, 456, 789]
}

而您想要一个类似的结果

{
  "id" : 4711,
  "stores" : [123, 789]
}

您没有删除任何内容。您正在修改资源,因此PUTPOSTPATCH是合适的方法。 JSON-Patch是描述此类更改的好格式。请求如下所示:

PATCH /groups/4711 HTTP/1.1
Content-Type: application/json-patch

[
  {
    "op" : "remove"
    "path" : "stores/1"
  }
]

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Globbing模式以匹配目录和文件 - java

我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …