当前位置: 首页 > 面试题库 >

Jersey POST方法正在接收空值作为参数

巩阳秋
2023-03-14
问题内容

我正在使用Jersey开发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访问这些方法,也许这就是问题之一。但是我一直在嗅探我的局域网,并且可以在数据包主体中看到正确的参数……这正确吗?

我已经从XCode发送了如下不同的正文内容:

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

和:

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

当我一直在使用@QueryParam和@PathParam却没有结果时…总是null …

谢谢你的帮助!


问题答案:

路径参数是请求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 作为路径参数,并且从请求正文中自动对联系人进行了序列化。

我上面描述的是 一般
规则。现在,关于您的案例的细节,我在您的代码中注意到的一件事是您实际上并未定义任何路径参数。请记住,必须@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请求( GETPOSTPUTDELETE )。

@QueryParam

目的 :用于将查询字符串的一部分注入或将编码数据形成变量。查询字符串是URL后面的那部分?。表单编码的数据是当请求类型为
application / x-www-form-urlencoded
时在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-urlencoded ,则是可能的:

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

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



 类似资料:
  • 我在向控制器发出的web api rest post请求中始终收到一个空值 在我的控制器中 模型 请求: 我尝试了以下解决方案,但没有任何效果 https://myadventuresincoding.wordpress.com/2012/06/19/c-supporting-textplain-in-an-mvc-4-rc-web-api-application/ 如何在WebAPI中获取POS

  • 问题内容: 我一直在尝试整个下午在网络上爬行,试图在动作控制器中接收JSON对象。 什么是正确的或更简单的方法? 我尝试了以下方法:1: 这给了我输入一个空值。 2: 这在尝试发布到它的jQuery方面给了我500错误?(这表示未正确绑定)。 这是我的jQuery代码: 我要做的就是在我的mvc动作中接收JSON对象? 问题答案: 不幸的是,Dictionary在MVC中存在模型绑定问题。在这里阅

  • 问题内容: 我只是在环游世界中练习51练习。解释声称,该方法在接收到a 而不是指向a的指针时无效。 然而,当我改变声明,以在输出唯一的变化是丢失的标记指针。 那么,即使变量不是指针,为什么还要更改它收到的变量呢? 问题答案: 它不会“接收”值。Go是强类型的,因此如果在某处指定了指向T的指针,则指向T()的指针是唯一可以作为该类型位置的值出现的选项。 “魔术”在编译器中,可以在某些条件下有效地“重

  • 问题内容: 我几天前接受采访时,被问到这样的问题。 问:反向链接列表。给出以下代码: 我很困惑,因为我不知道接口对象可以用作方法参数。面试官解释了一下,但我仍然不确定。有人可以启发我吗? 问题答案: 实际上,这是使用接口的最常见和最有用的方法之一。该接口定义了一个契约,您的代码可以与实现该接口的任何类一起使用,而无需了解具体的类- 它甚至可以与编写代码时尚不存在的类一起使用。 Java标准API中

  • 在编写了自己的通用功能接口并将其用于lambdas之后,我必须在一种新方法中使用它: 将通用数组作为输入处理,检查其最小长度是否为4 处理我的功能界面的任何实例 处理lambda表达式的任何实例,该表达式接受一个参数,但不返回任何内容 应用于函数接口实例的结果(这里我想我必须使用使用者) 以前从未使用过函数接口,有人能解释一下我应该如何将2个函数接口作为方法参数传递吗? 例如:

  • 问题内容: 我不知道为什么此代码在PHP中不起作用? 看来它没有违反任何OOP规则,但是为什么它给我一个错误? 问题答案: 它 确实 违反了SOLID规则。您声明接受一个类型的参数,但子级接受一个类型的参数。即使是的子类型,它仍然是不同的类型。 当上课的时候,上课也是正确的。但是接受一个,但是不接受一个。因此,据推测,但不接受type参数。这打破了Liskov替代原则。您不能在子接口,周期中更改参