Метод REST не будет PUT или POST на сервер - PullRequest
0 голосов
/ 21 октября 2011

Я пытаюсь заставить некоторые методы REST работать в моем приложении Spring, но, похоже, они не увенчались успехом. Я явно что-то упускаю, но я не могу сказать по жизни, что это будет. Вот мой контроллер:

@Controller
public class IndexController {
    static Logger log = Logger.getLogger(IndexController.class);

    @Autowired
    private ProvisionService provisionService;

    @RequestMapping(value="/home/data", method=RequestMethod.GET,
                    headers="Accept=application/json")
    public @ResponseBody List<Provision> getData() {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = null;

        if(principal instanceof UserDetails)
            username = ((UserDetails)principal).getUsername();

        return provisionService.getAllByUser(username);
    }

    //JSON put request - doesn't work currently
    @RequestMapping(value="/home/data", method=RequestMethod.PUT,
                    headers="Content-Type=application/json")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void updateProvisions(@RequestBody List<Provision> provisions) {
        log.info("Provisions: " + provisions.toString());
    }

    @RequestMapping(value={"/","/home"}, method=RequestMethod.GET)
    public void showIndex() {}
}

Вот основная часть JSP, которая его использует:

<sf:form id="homeForm" method="put" action="${homeData_url}"></sf:form>

Форма отправляется через Javascript, когда пользователь нажимает кнопку. Во всяком случае, все работает нормально для GET. Я получаю Json с моим списком объектов, никаких проблем. Затем я показываю это с помощью Dojo и пока все хорошо. Тем не менее, когда я пытаюсь вернуть Json с этой формой, я получаю 405 - Запрос метода «POST» не поддерживается ошибка. Как вы можете видеть, у меня есть обработчик метода в моем контроллере, поэтому я действительно не уверен, что я делаю неправильно. Я взял этот обработчик из книги Spring in Action 3, и он также напоминает то, что говорят некоторые документы и материалы Spring, но, очевидно, я упускаю ключевой компонент. У кого-нибудь есть мысли?

У меня действительно есть HiddenHttpMethodFilter, отображенный в моем файле web.xml, поэтому я использую тег формы Spring.

В любом случае, любые мысли или помощь приветствуются. Спасибо.

------------------ UPDATE ------------------

Вот заголовки после того, как я нажму на кнопку и получу ошибку 405, если это поможет:

http://localhost:8080/NFI/home

POST /NFI/home HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
Referer: http://localhost:8080/NFI/home
Cookie: JSESSIONID=584AC21ADE4F214904B9E7E2370363EF
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

HTTP/1.1 405 Method Not Allowed
Server: Apache-Coyote/1.1
Allow: GET, PUT
Content-Type: text/html;charset=utf-8
Content-Length: 1085
Date: Fri, 21 Oct 2011 15:39:26 GMT

Ответы [ 3 ]

0 голосов
/ 21 октября 2011

Добавьте вам необходимо добавить параметр _method со значением PUT к вашему запросу. Не к содержанию JSON!

Итак, на первом шаге я бы изменил запрошенный URL-адрес на /home/data?_method=PUT.

Если это работает, вы можете найти способ добавить параметр _method в содержимое запроса, не нарушая данные Json.

0 голосов
/ 24 октября 2011

Вы обновили свой вопрос с помощью заголовков. Не могли бы вы также поместить весь запрос (фактические сброшенные значения), чтобы увидеть отправляемые параметры _method?

Кроме того, хотя я предполагаю, что заголовки = "" - правила действительны, они не должны быть необходимы. У вас есть bean-компонент json converter, который будет выполнять marshall и unmarshall в зависимости от типа содержимого и принимать заголовки, если не найден действительный конвертер. Spring возвратит ошибку.

Единственная причина включить его в @RequestMapping - это если у вас есть метод, который на самом деле делает что-то еще, если вы вызываете его с помощью XML вместо JSON, и это звучит как плохой дизайн.

Удалите эти правила заголовков и попробуйте снова, сделайте это как можно проще и постепенно добавьте логику.

0 голосов
/ 21 октября 2011

Отправка формы осуществляется с помощью POST. Вы получаете сообщение «POST» не поддерживается.

Выше я вижу, что вы используете RequestMethod.PUT в вашем исходном коде. Там нет никакого упоминания о POST вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...