我有以下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,并且两种方式都有效?
最终,我只需要一种方法让用户能够向这个端点发送理由,但不是必须的。而且由于理由可能很长,我无法将其作为查询参数或路径参数。
谢谢!
答案 0 :(得分:2)
由于endpoint
说endpoint
,您根本无法点击@Consumes({MediaType.APPLCIATION_JSON})
而没有任何内容。此外,当您在使用Web服务时尝试POST
类时,必须有一些内容。
就像你说的那样,即使它是NULL
或{}
,只要它有一些内容就没关系。
只有当您发出GET
请求时,才会将任何内容传递给服务。
对于所有其他HTTP methods
,例如POST
,PUT
和DELETE
,您将强制 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响应,正如我所期望的那样。
我希望用一种方法指定一个可选参数,但这个解决方案非常有效。