How to pass comma separated parameters in a url for the get method of rest service

Ravi Mishra picture Ravi Mishra · Apr 25, 2012 · Viewed 24k times · Source

I have a webservice like

@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()));
}

If I call this web service from my test class, it works fine; but if I call it through the browser, I get message as cannot find the service.

The url I am using through the browser is

http://localhost:8080/WebApp/services/seating/mylogin/july/1,0,0/month

if I use the url as

http://localhost:8080/WebApp/services/seating/mylogin/fly/1/0/0/month

and change the path in the service accordingly it works fine, but the requirement is to use comma instead of slash. Is there any way we can use the webservice with comma-separated parameters in the url?

Answer

Alex picture Alex · Apr 25, 2012

For me there is no problem with separating multiple parameters with a comma, even if these are part of the path instead of being query parameters. I tested it and it actually works.

Actually you can even directly bind to int if you do not need to check for correctness of these parameters. I did use @PathVariable for these binding.

@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);
}

Edit:

As for the code I tested this is it:

@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;
    }
}

With a correct view located at /seating/month.jsp for the first method.

Alternatively, returning an entity composed of the 3 params and producing json or xml makes no problem either.