路径参数是请求URL中与特定模式匹配的一部分。因此,对于可以指定为路径参数的字符有限制-特别是任何特殊字符都需要进行URL编码。这适用于任何类型的请求(
GET , POST , PUT , DELETE )。
通常,您应该将路径参数限制为简单的值,例如标识符或资源端点-
更复杂的数据应通过请求参数或请求主体本身传递给REST服务。这是一种混合方法,它将实体标识符作为路径参数以及请求主体中的实体数据传递:
@Path("/contacts/{id}")@PUT@Consumes(MediaType.APPLICATION_JSON)@Produces(MediaType.APPLICATION_JSON)public Response updateContact(@PathParam final String contactId, Contact contact) {}在上面的示例中,获取 contactId 作为路径参数,并且从请求正文中自动对联系人进行了序列化。
我上面描述的是 一般
规则。现在,关于您的案例的细节,我在您的代码中注意到的一件事是您实际上并未定义任何路径参数。请记住,必须
@Path先将它们定义为注释的一部分,然后才能在REST方法中使用它们:
@Path("/method/{obj1}/{obj2}")public ResponseObject method(@Context Request request, @PathParam("obj1") Object obj1, @PathParam("obj2") String obj2) {}通过上述更改,假设您已经在客户端正确编码了URL,则您的参数将不再显示为空。
编辑
根据您的评论,我认为您需要更加熟悉JAX-RS规范和各种参数类型。我建议您仔细阅读RESTEasy JAX-
RS文档。它具有一些特定于供应商的实现细节,但总而言之,它是JAX-
RS的出色指南。
@PathParam
目的 :用于将请求URL的一部分注入变量。请注意,URL参数 不 被视为URL的一部分。
示例 :给定URL
http://services.example.com/contacts/20578
,我可以定义:
@Path("/contacts/{id}")从中我可以注入一个
@PathParam("id")。public Response getContact(@PathParam("id") final String identifier);这适用于 任何 类型的HTTP请求( GET , POST , PUT , DELETE )。
@QueryParam
目的 :用于将查询字符串的一部分注入或将编码数据形成变量。查询字符串是URL后面的那部分
?。表单编码的数据是当请求类型为
application / x-www-form-urlenpred
时在HTTP请求的主体中传递的URL编码的名称/值对数据。通常,对于GET请求,查询参数作为URL字符串的一部分传递,对于POST请求,则在请求正文中传递。
示例:给定URL
http://services.example.com/contacts?group=Business,我可以注入一个
@QueryParam("group")public Response getContactsInGroup(@QueryParam("group") final String groupName);在POST请求中通常使用查询参数,但是如果请求类型为 application / x-www-form-urlenpred ,则是可能的:
@POST@Path("/contacts")@Consumes(MediaType.APPLICATION_FORM_URLENCODED)public Response createContact(@QueryParam("contact") final Contact contactData, @QueryParam("metadata") final String metaData);这些只是高级示例,请通读我链接的文档,以获得有关每种参数类型如何工作以及何时使用哪种参数的更好示例。



