将来自REST调用的@PathParam值存储在列表或数组中
问题内容:
我的函数如下所示:
@PUT
@Path("property/{uuid}/{key}/{value}")
@Produces("application/xml")
public Map<String,ValueEntity> updateProperty(@Context HttpServletRequest request,
@PathParam("key") String key,
@PathParam("value") String value,
@PathParam("uuid") String uuid) throws Exception {
...
}
我必须对其进行修改,因此它接受来自REST调用的不确定(或许多)键-值对列表,例如
@Path("property/{uuid}/{key1}/{value1}/{key2}/{value2}/{key3}/{value3}/...")
是否可以将它们存储在数组或列表中,所以为了避免这种情况,我不会列出数十个@PathParams和参数:
@PathParam("key1") String key1,
@PathParam("key2") String key2,
@PathParam("key3") String key3,
问题答案:
可能是重新思考此设计的好机会。通过使用/
s,我们以一种表示的方式/
进行了尝试,每种方法都试图查找不同的资源。键/值对(在URL的上下文中)主要用于查询参数或矩阵参数。
如果/property/{uuid}
是通往主要资源的路径,而我们只想向客户端提供一些参数以访问该资源,则可以允许矩阵参数或查询参数
矩阵参数 (在请求网址中)看起来像
/12345;key1=value1;key2=value2;key3=value3
获取值的资源方法可能类似于
@GET
@Path("/property/{uuid}")
public Response getMatrix(@PathParam("uuid") PathSegment pathSegment) {
StringBuilder builder = new StringBuilder();
// Get the {uuid} value
System.out.println("Path: " + pathSegment.getPath());
MultivaluedMap matrix = pathSegment.getMatrixParameters();
for (Object key : matrix.keySet()) {
builder.append(key).append(":")
.append(matrix.getFirst(key)).append("\n");
}
return Response.ok(builder.toString()).build();
}
- 看到
PathSegment
查询参数 (在请求网址中)可能类似于
/12345?key1=value1&key2=value2&key3=value3
获取值的资源方法可能类似于
@GET
@Path("/property/{uuid}")
public Response getQuery(@PathParam("uuid") String uuid,
@Context UriInfo uriInfo) {
MultivaluedMap params = uriInfo.getQueryParameters();
StringBuilder builder = new StringBuilder();
for (Object key : params.keySet()) {
builder.append(key).append(":")
.append(params.getFirst(key)).append("\n");
}
return Response.ok(builder.toString()).build();
}
- 看到
UriInfo
区别在于Matrix参数可以嵌入到路径段中,而查询参数必须放在URL的末尾。您还会注意到语法上的一些差异。
更新
同样查看PUT
in方法的签名,似乎您正在尝试使用路径作为要更新的值来更新资源,因为我没有在实体主体的方法中看到任何参数。放置时,您应该在实体主体中发送表示,而不是作为路径段_或_ 参数发送。