Java 如何在url中为rest服务的get方法传递逗号分隔的参数

Java 如何在url中为rest服务的get方法传递逗号分隔的参数,java,web-services,jax-rs,restful-url,Java,Web Services,Jax Rs,Restful Url,我有一个像 @GET @Produces("application/json") @Path("{parameter1}/july/{param2},{param3},{param4}/month") public Month getResult(@PathParam("parameter1") String parameter1, @PathParam("param2") PathSegment param2 , @PathParam("param3") PathSegment param3,

我有一个像

@GET
@Produces("application/json")
@Path("{parameter1}/july/{param2},{param3},{param4}/month")
public Month getResult(@PathParam("parameter1") String parameter1, @PathParam("param2") PathSegment param2 , @PathParam("param3") PathSegment param3, @PathParam("param4") PathSegment param4) {
    return action.getResult(parameter1, new Integer(param2.getPath()), new Integer(param3.getPath()), new Integer(param3.getPath()));
}
如果我在测试类中调用这个web服务,它工作得很好;但是如果我通过浏览器调用它,我会收到消息,因为找不到服务

我通过浏览器使用的url是

如果我使用url作为


并相应地更改服务中的路径,这样做很好,但要求使用逗号而不是斜杠。有没有办法在url中使用带有逗号分隔参数的Web服务?

url参数不是逗号分隔的,而是“&”分隔的。因此,您需要做的是将它们分隔开。

对于我来说,用逗号分隔多个参数没有问题,即使这些参数是路径的一部分而不是查询参数。 我测试了它,它确实有效

实际上,如果不需要检查这些参数的正确性,您甚至可以直接绑定到
int
。我确实使用了
@PathVariable
进行这些绑定

@GET
@Produces("application/json")
@Path("{parameter1}/july/{param2},{param3},{param4}/month")
public Month getResult(@PathVariable("parameter1") String parameter1, @PathVariable("param2") int param2 , @PathVariable("param3") int param3, @PathVariable("param4") int param4) {
    return action.getResult(parameter1, param2, param3,param3);
}
编辑: 至于我测试的代码,就是这样:

@Controller
public class InfoController {
    @RequestMapping(method = RequestMethod.GET, value = "/seating/{param1},{param2},{param3}/month")
    public String showMonthView(Model uiModel, @PathVariable("param1") int p1, 
            @PathVariable("param2") int p2, @PathVariable("param3") int p3, 
            HttpServletRequest httpServletRequest) {
        LOG.debug(String.format("view:/seating/%d,%d,%d/month", p1, p2, p3));
        uiModel.addAttribute("param1", p1);
        uiModel.addAttribute("param2", p2);
        uiModel.addAttribute("param3", p3);
        return "month";
    }

    @ResponseBody
    @RequestMapping(method = RequestMethod.GET, value = "/seating/{param1},{param2},{param3}/month", produces="application/json")
    public Map<String, Integer> showMonthJson(@PathVariable("param1") final int p1, 
            @PathVariable("param2") final int p2, @PathVariable("param3") final int p3) {
        LOG.debug(String.format("json:/seating/%d,%d,%d/month", p1, p2, p3));
        Map<String, Integer> result = new HashMap<String, Integer>() {{
            put("param1", p1);
            put("param2", p2);
            put("param3", p3);
        }};
        return result;
    }
}
@控制器
公共类信息控制器{
@RequestMapping(method=RequestMethod.GET,value=“/seating/{param1},{param2},{param3}/month”)
公共字符串showMonthView(模型uiModel,@PathVariable(“param1”)int p1,
@路径变量(“param2”)int p2、@PathVariable(“param3”)int p3、,
HttpServletRequest(HttpServletRequest){
LOG.debug(String.format(“视图:/seating/%d,%d,%d/月”,p1、p2、p3));
uiModel.addAttribute(“参数1”,p1);
uiModel.addAttribute(“参数2”,p2);
uiModel.addAttribute(“参数3”,p3);
返回“月”;
}
@应答器
@RequestMapping(method=RequestMethod.GET,value=“/seating/{param1},{param2},{param3}/month”,products=“application/json”)
公共地图显示MonthJSON(@PathVariable(“param1”)最终整数p1,
@路径变量(“参数2”)最终整数p2,@PathVariable(“参数3”)最终整数p3){
LOG.debug(String.format(“json:/seating/%d,%d,%d/月”,p1、p2、p3));
映射结果=新的HashMap(){{
放置(“参数1”,p1);
put(“param2”,p2);
放置(“参数3”,p3);
}};
返回结果;
}
}
第一个方法的正确视图位于/seatch/month.jsp


或者,返回由3个参数组成的实体并生成json或xml也没有问题。

在您的示例中,您使用的是表示整个路径段的
PathSegment
,在您的示例中,它是“1,0,0”,因此无法解析为整数

如果您使用
int
而不是
PathSegment
,那么将按照您的预期提取值,并且方法体将更加简洁

以下代码对我来说很好:

@GET
@Path("{parameter1}/july/{param2},{param3},{param4}/month")
public String commaSeparatedValueDemo(@PathParam("parameter1") String parameter1, @PathParam("param2") int param2, @PathParam("param3") int param3, @PathParam("param4") int param4) {
  return MessageFormat.format("{0}: {1}, {2}, {3}", parameter1, param2, param3, param4);
}
回应

…/某些资源/参数1/7月/1,2,3/月


参数1:1、2、3

+1表示一个写得好的问题。现在很难找到这些参数。为什么要使用URL路径将参数传递给服务,而不是将其作为标准的GET参数发送?例如,我会将服务部署到
/WebApp/services/seatching
,然后让客户端调用URL,如
/WebApp/services/seatching?param1=mylogin¶m2=fly¶m3=1¶m4=0…
。我无法使用?然后params,所有的URL都在js文件中,并根据UI的请求动态调用,在w3建议中,我看到浏览器在遇到逗号时会删除参数,并在逗号之前查找资源,我想这就是问题的原因,我的测试类在没有任何问题的情况下调用服务并返回result@RaviMishra那么哪个答案对你有帮助?你能通过向上投票把它标记为“这个答案很有用”吗?这是正确的,只是他甚至还没有一个查询字符串。OP正在将参数作为URL路径本身的一部分进行传递。感谢您的回复,但是,我无法使用&在这里,我甚至没有应用程序的前端/UI,我所拥有的只是URL和浏览器,我可以使用它们来访问应用程序service@RaviMishra那对我来说毫无意义。您的问题涉及“URL中以逗号分隔的参数”。如果这不是问题的真正含义,我建议您相应地编辑您的问题。@EJP实际上不仅仅是关于url,而是关于使用url(带有逗号分隔的参数)来调用Web服务。该url属于restwebservice@RaviMishra所以下定决心吧。如果它们是URL的参数,那么它们应该是&-分隔的,没有两种方法。如果它们是单个参数的一部分,则需要使用
java.net.urlcoder
对逗号进行URL编码。你不能把任何你喜欢的东西放进URL中,这是有规则的。我用@PathVariable也这么做了,但对我不起作用,我的运气不好,你是这样使用URL并尝试使用浏览器访问服务的吗?是的,我修改了我在本地使用的应用程序,并尝试了两种url:
localhost/webapp/seating/1,2,3
localhost/webapp/seating/1,2,3/month
。你想让我更新答案以包含我的测试代码吗?请这样做,这将非常有帮助。非常感谢Alex,我发现了问题并解决了它,实际上是应用程序UI中的url编码问题,url没有正确编码为相应的ascii逗号值。