【问题标题】:How to pass null value in RESTful web service for a GET Method?如何在 RESTful Web 服务中为 GET 方法传递空值?
【发布时间】:2012-12-21 11:38:53
【问题描述】:

我目前有一个使用 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>

【问题讨论】:

    标签: rest get null cxf jax-rs


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Aviram,这有助于我向前迈出一步。但是,如果我提交没有用户 ID 的请求,我会看到在服务器端 channelid 的值被视为用户 ID,而 channelId 为空。我可以重新排列参数并完成我的工作,但是是否可以在服务器端具有相同的参数顺序并且仍然将 null 或空字符串传递给 userid ?
    • 可能有问题,因为我没有在userid: 后面加空格,你可以试试加空格看看会发生什么?
    • 没有空间它工作!我的意思是它允许我发送“”(空字符串),我假设/将其转换为服务器端的 null。但是在将以下网址提交到服务器时。发生的事情是 FirstParameter = membernumber 为 51 SecondParameter = userId 为 1 而 ThirdParameter = channelId 为 null。即,如果传递了 null 或 emptyString (51//1),则将 channelID(第三个参数)映射到 userId(第二个参数)。 boardingservice/comint/webservice/getProfile/51//1 类似下面stackoverflow.com/questions/11266349/…
    • 我明白了,但是没有空格怎么办?我在某处读到它可能会产生影响
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我通过解决方法解决了这个问题。我创建了另一个只接受两个参数的方法。现在根据请求 URL 调用不同的方法

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:
          @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

          【讨论】:

            【解决方案6】:

            需要更详细地描述所有可能的情况。看基于Spring Framework的例子:

                    @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 值。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-16
              • 1970-01-01
              相关资源
              最近更新 更多