Как передать параметры, разделенные запятыми, в 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, @PathParam("param4") PathSegment param4) {
    return action.getResult(parameter1, new Integer(param2.getPath()), new Integer(param3.getPath()), new Integer(param3.getPath()));
}

Если я вызываю эту веб-службу из своего тестового класса, она работает нормально; но если я вызову его через браузер, я получаю сообщение, так как не могу найти службу.

URL, который я использую через браузер,

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

если я использую url как

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

и измените путь в службе, соответственно, он отлично работает, но необходимо использовать запятую вместо косой черты. Можно ли использовать веб-сервис с параметрами, разделенными запятыми, в URL?

Ответ 1

Для меня нет проблем с разделением нескольких параметров запятой, даже если они являются частью пути вместо параметров запроса. Я тестировал его, и он действительно работает.

На самом деле вы можете даже напрямую привязываться к 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;
    }
}

С правильным представлением, расположенным в /seating/month.jsp для первого метода.

В качестве альтернативы, возвращение объекта, состоящего из трех параметров и создания json или xml, тоже не создает проблем.

Ответ 2

В вашем примере вы используете 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/июль/1,2,3/месяц

является

параметр1:1, 2, 3

Ответ 3

Параметры URL не разделяются запятыми, они "&" - разделены. Итак, что вам нужно сделать, это "&" - отделить их.