泽西岛 POST 方法接收空值作为参数

2022-09-04 07:06:50

我正在使用泽西岛开发RESTful服务,它与GET方法配合得很好。但是,我无法使其与POST方法和JSON或文本参数一起使用。这些是我所做的:

@Path("/method/")
@POST
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
@Produces({MediaType.APPLICATION_JSON})
public ResponseObject method(@Context Request request, @PathParam("ob1") Object obj1, @PathParam("obj2") String obj2) {
...
}

我只得到所有参数的空值。我试图只使用字符串作为参数,但它也不起作用......我正在尝试从IOS访问这些方法,也许这是问题之一。但是,我一直在嗅我的LAN,我可以在数据包正文中看到正确的参数...这是正确的吗??

我从XCode发送了不同的正文内容:

obj1={"id1": "value1", "id2" : "value2"}&obj2=xxxx

和:

{"id1": "value1", "id2" : "value2"},xxxx

虽然我一直在玩@QueryParam和@PathParam没有结果......始终为空...

感谢您的帮助!


答案 1

路径参数是与特定模式匹配的请求 URL 的一部分。因此,对于可以指定为路径参数的内容存在字符限制 - 特别是任何特殊字符都需要进行URL编码。这同样适用于任何类型的请求(GETPOSTPUTDELETE)。

作为一般规则,应将路径参数限制为简单值(如标识符或资源终结点) - 应通过请求参数或请求正文本身将更复杂的数据传递到 REST 服务。下面是一种混合方法,它将实体标识符作为路径参数传递,并在请求正文中传递实体数据:

@Path("/contacts/{id}")
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response updateContact(@PathParam final String contactId, Contact contact) {
}

在上面的示例中,将 contactId 作为路径参数获取,并从请求正文中自动序列化联系人。

我上面描述的是一规则。现在,关于您的情况的具体情况,我在您的代码中注意到的一件事是,您实际上并没有定义任何路径参数。请记住,在 REST 方法中使用它们之前,必须将它们定义为注释的一部分:@Path

@Path("/method/{obj1}/{obj2}")
public ResponseObject method(@Context Request request, @PathParam("obj1") Object obj1, @PathParam("obj2") String obj2) {
}

通过上述更改,假设您在客户端对 URL 进行了正确的编码,则参数应不再显示为 null。


* 编辑 *

根据您的评论,我认为您需要更加熟悉 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请求(GETPOSTPUTDELETE)。


@QueryParam

用途:用于将部分查询字符串或将编码数据形式注入到变量中。查询字符串是 URL 中在 之后的部分。表单编码数据是在 HTTP 请求正文中传递的 URL 编码的名称/值对数据,当请求类型为 application/x-www-form-urlencoded 时。通常,查询参数作为 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-urlencoded,则可以使用:

@POST
@Path("/contacts")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createContact(@QueryParam("contact") final Contact contactData, @QueryParam("metadata") final String metaData);

这些只是高级示例,请阅读我链接的文档,以获得有关每种参数类型如何工作以及何时使用哪一种的更好示例。


答案 2

我刚刚开始用java开发Webservice,并且在POST数据上遇到了同样的问题。我得到了非常简单的解决方案,使用@FormParam读取POST数据,实际上我正在使用@QueryParam来读取POST数据,我认为它仅用于使用GET方法读取QueryString数据

这里给出了一个非常好的文档。读完这篇文章后,我的大部分困惑都被清除了。http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html_single/index.html

提示:只需确保在使用“应用程序/x-www-form-urlencoded”mime 类型时@FormParam