11

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?

4
  • 1
    +1 for a well written question. They're so hard to come by these days on SO. Commented Apr 25, 2012 at 10:34
  • 1
    Why are you using the URL path to pass parameters to your service instead of sending them as standard GET params? For instance, I would deploy the service to /WebApp/services/seating, and then have clients make calls to URL's like /WebApp/services/seating?param1=mylogin&param2=fly&param3=1&param4=0.... Commented Apr 25, 2012 at 10:39
  • I cannot make calls using? then params, all the urls are in js file and dynamically get called based on the request from the UI, In w3 recommendations I saw browsers drop the parameters if comma is encountered and looks for resource before comma, I guess that is causing the issue, my test class invokes the service without any issues and returns the result Commented Apr 25, 2012 at 11:56
  • @RaviMishra so which answer helped you? can you mark it as "This answer is useful" by upvoting it. Commented Sep 10, 2019 at 7:05

3 Answers 3

1

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.

Sign up to request clarification or add additional context in comments.

4 Comments

I did the same using @PathVariable but didn't worked for me, my bad luck, did you used url like this localhost:8080/WebApp/services/seating/mylogin/july/1,0,0/month and tried accessing the service using browser?
Yes, I modified an application that I use in local, and tried both url: localhost/webapp/seating/1,2,3 and localhost/webapp/seating/1,2,3/month. Do you want me to update the answer to include my test code?
Please do, that would be very helpful
Thanks a lot Alex, I found the issue and fixed it, actually it was url encoding issue from the UI of the application, the url was not encoded properly with corresponding ascii value of the comma.
1

In your example you are using PathSegment which represent the whole path segment, which in your case is "1,0,0" and thus cannot be parsed as integer.

If you would use int instead of PathSegment, the values would be extracted as you expect and the method body would be much more concise.

The following code worked fine for me:

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

Response for

.../some-resource/parameter1/july/1,2,3/month

is

parameter1: 1, 2, 3

Comments

0

URL parameters are not comma-separated, they are '&'-separated. So what you have to do is '&'-separate them.

7 Comments

That's correct, except he doesn't even have a query-string yet. The OP is passing parameters as part of the URL path itself.
Thanks for the reply but, I cannot use & here, I don't have even the frontend/UI of the application, all I have is the url and browser which I can use to hit the service
@RaviMishra That doesn't make any sense to me. Your question talks about 'comma separated parameters in the URL'. If that isn't what it is really about, I suggest you edit your question accordingly.
@EJP actually its not just about url, its about using url having comma separated parameters to call a webservice. The url belongs to a rest webservice
@RaviMishra So make up your mind. If they are parameters to the URL they should be &-separated, no two ways about it. If they are part of a single parameter, the commas need to be URL-encoded with java.net.URLEncoder. You can't put just anything you like into a URL, there are rules about this.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.