使用RestEasy,可以选择在POST中将参数作为JSON传递

时间:2015-09-24 17:11:18

标签: json ajax rest resteasy endpoint

我有以下REST端点:

@POST
@Path("/id/{id}/doSomething")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
public Response doSomething(@PathParam("id") final String id, MyObject foo) {
    // does some stuff; checks for a null foo and handles it
}

MyObject类有一个名为justification的字符串字段。

我希望能够在没有内容的情况下点击此端点,或者使用映射到MyObject类的JSON。我想要任何一种工作方式。换句话说,foo可以实例化,或foo可以为null;我有代码来处理这两种情况。

问题是JSON内容似乎需要到此端点,而不是可选。因此,在测试期间,我 发送到端点,或者我收到500错误。即使那个JSON只是{}(我也可以发送{ justification: "blah blah" }并且也能正常工作)。但是,根本不发送任何内容会导致呼叫失败;甚至从未击中终点。

所以,我的问题是,如何设置此端点以便我可以在没有任何内容的情况下POST它,或者在映射到foo的正文中使用JSON,并且两种方式都有效?

最终,我只需要一种方法让用户能够向这个端点发送理由,但不是必须的。而且由于理由可能很长,我无法将其作为查询参数或路径参数。

谢谢!

2 个答案:

答案 0 :(得分:2)

由于endpointendpoint,您根本无法点击@Consumes({MediaType.APPLCIATION_JSON})而没有任何内容。此外,当您在使用Web服务时尝试POST类时,必须有一些内容。 就像你说的那样,即使它是NULL{},只要它有一些内容就没关系。 只有当您发出GET请求时,才会将任何内容传递给服务。 对于所有其他HTTP methods,例如POSTPUTDELETE,您将强制 HAVE 发送一些数据。 作为您问题的解决方案,您可能会做的是 - 检查您收到的内容是NULL还是{},并且根本不对它们进行处理。

如果您仍然对答案感到困惑,这取决于您使用的是SOAP还是REST,这个帖子可以帮助您。 How to express 'null' value from web service as real null or empty string instead of 'null' string 希望这可以帮助。

答案 1 :(得分:2)

通过编写使用相同REST路径注释的第二个方法,我能够完成我想要的任务。第二种方法没有@Consumes语句,并且在方法声明中没有第二个参数。看起来像这样:

@POST
@Path("id/{id}/doSomething")
@Produces({ MediaType.APPLICATION_JSON })
public Response doSomethingWithoutJustification(@PathParam("id") final String id) {
    doSomething(id, null);
}

这个新方法映射到相同的路径,但不期望JSON并且不会暴露第二个参数。因此,当我在请求正文中没有任何内容时,它会点击doSomethingWithoutJustification,当我在请求正文中提供JSON时,它会点击doSomething。当然,如果我在请求正文中提供除有效JSON之外的任何内容,我会收到来自该服务的500响应,正如我所期望的那样。

我希望用一种方法指定一个可选参数,但这个解决方案非常有效。