如何在RESTful Web服务中为GET方法传递空值?

时间:2012-12-21 11:38:53

标签: rest get null cxf jax-rs

我目前使用 CXF 公开了 RESTFul 网络服务。方法看起来像这样。

@GET
@Path("/getProfile/{memberno}/{userid}/{channelid}")
@Consumes("application/xml")
public MaintainCustomerProductResponse getUserDetails(
        @PathParam("memberno") String membernumber,
        @PathParam("userid") String userid,
        @PathParam("channelid") String channelid){
//DO Some Logic here.
}

可以通过以下URL&在提交有效数据时,我得到了答复。

http://server.com:8080/UserService/getProfile/{memberno}/{userid}/{channelid}

问题:如何为userid传递空值?

如果我简单地忽略了{userId}请求没有在服务器端Web服务上点击。

实施例

http://server.com:8080/UserService/getProfile/1001//1

注意:我正在使用SOAPUi进行测试,并且没有给出userId值,我在SOAPUI上看到了以下响应,而请求没有到达服务器。

SOAPUI响应

<data contentType="null" contentLength="0"><![CDATA[]]></data>

6 个答案:

答案 0 :(得分:7)

变量的默认匹配是[^/]+?(至少一个字符),您可以手动将匹配设置为[^/]*?,它也应匹配空字符串。

只需将格式添加到userid变量:

@Path("/getProfile/{memberno}/{userid: [^/]*?}/{channelid}")

答案 1 :(得分:1)

请更改@Path("/getProfile/{memberno}/{userid}/{channelid}")  @Path("/getProfile/{memberno}/{userid = default}/{channelid}")以便它接受用户ID的空值。您可以使用Uri模板指定可选参数的默认值。请参阅

http://msdn.microsoft.com/en-us/library/bb675245.aspx

答案 2 :(得分:0)

我通过Work Around解决了这个问题。我创建了另一个只带两个参数的方法。现在基于请求URL,不同的方法称为

答案 3 :(得分:0)

@GET
@Path("qwer/{z}&{x:.*?}&{c}")
@Produces(MediaType.TEXT_PLAIN)
public String withNullableX(
        @PathParam("z") Integer z,
        @PathParam("x") Integer x,
        @PathParam("c") Integer c
) {
    return z + "" + x + "" + c;
}

通过
致电时 http://localhost:8080/asdf/qwer/1&&3
您会看到:
1null3

答案 4 :(得分:0)

您可以使用URL编码,并传递%00。请参阅this

示例:http://server.com:8080/UserService/getProfile/1001/%00/1

答案 5 :(得分:0)

需要更详细地描述所有可能的情况。看一下基于Spring框架的示例:

        @RestController
        @RequestMapping("/misc")
        public class MiscRestController {
    ...
            @RequestMapping(value = { "/getevidencecounts/{userId}",
                    "/getevidencecounts/{userId}/{utvarVSId = default}" }, method = RequestMethod.GET)
            public ResponseEntity<EvidenceDokumentuCountTO> getEvidenceCounts(
                    @PathVariable(value = "userId", required = true) Long userId,
                    @PathVariable(value = "utvarVSId", required = false) Long utvarVSId) {
...

我们需要使用.../misc/1(1),.../misc/1/25(2),.../misc/1/null(3)之类的路径。路径1表示为/getevidencecounts/{userId}。路径2和3 /getevidencecounts/{userId}/{utvarVSId = default}。如果确定该默认值为null,则还可以在声明= default中使用= null的值。