Почему spring mvc запросы метода отображения put возвращают редирект как метод put - PullRequest
0 голосов
/ 25 марта 2020

Hi, Я делаю свой личный проект как "обучаемый".

Я столкнулся с проблемой.

Я хочу отправить запрос PUT на сервер, а сервер перенаправить на другой URL (GET request).

  1. Запрос «PUT / course / 1 / edit»
  2. Сервер обрабатывает некоторые логи c и перенаправляет на «GET / members / 1 / courses / manage»

Однако сервер не работает.

Spring MVC Сообщение об ошибке - Request method 'PUT' not supported.

Chrome Ошибка консоли - PUT http://localhost:8080/members/1/courses/manage 405

Если отображение запроса - POST, а GET - не PUT, перенаправление возврата работает хорошо.

Мне просто интересно, почему отображение перенаправления запросов PUT mapping возвращает метод PUT.

Ниже, Spring MVC нашел имя представления "redirect: / members / 1 / courses / manage" и перенаправил на "members / 1 / courses / manage", используя метод PUT. На данный момент я не могу понять, почему пружина mvc использует метод PUT для перенаправления.

o.s.web.servlet.view.RedirectView        : View name 'redirect:/members/1/courses/manage', model {}
o.s.web.servlet.DispatcherServlet        : Completed 302 FOUND
o.s.web.servlet.DispatcherServlet        : PUT "/members/1/courses/manage", parameters={}
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported]
o.s.web.servlet.DispatcherServlet        : Completed 405 METHOD_NOT_ALLOWED

И если вам известен какой-либо документ, который может помочь мне в решении этой проблемы, пожалуйста, порекомендуйте его мне.

Заранее спасибо!

передний код

function courseEdit(courseUrl) {
    let formDataArray = $("#course-edit-form").serializeArray();
    let formDataObject = {};
    for (const element of formDataArray) {
        formDataObject[element.name] = element.value;
    }
    let courseEditFormDataJsonFormat = JSON.stringify(formDataObject);

    $.ajax({
        type: 'PUT',
        url: courseUrl,
        data: courseEditFormDataJsonFormat,
        contentType: 'application/json'
    }).done(function( data, textStatus, jqXHR ) {

    });
}

задний код

@PutMapping("/courses/{id}")
public String editCourse(@PathVariable Long id, @RequestBody CourseDto courseDto) {
        CourseDto foundCourseDto = courseService.findById(id);
        Long instructorId = foundCourseDto.getInstructor().getId();

        // redirect:/members/1/courses/manage
        return "redirect:/members/"+instructorId+"/courses/manage";
}

@GetMapping("/members/{id}/courses/manage")
public String courseDashboard(@PathVariable Long id, Model model) {
    CoursesDto ownCourse = courseService.findOwnCourse(id);
    model.addAttribute("coursesDto", ownCourse);
    return "course/course_dashboard";
}

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

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

0 голосов
/ 25 марта 2020

Ваш @PutRequest перенаправляется на /members/{id}/courses/manage, который является @GetMapping конечной точкой.

Как указал chrylis -on strike- , это не так, как вы должны go об этом.

Вы должны выполнить перенаправление во внешнем интерфейсе после того, как ваш запрос ajax будет выполнен. Вы можете сделать это, используя window.location.

Пример:

$.ajax({
        type: 'PUT',
        url: courseUrl,
        data: courseEditFormDataJsonFormat,
        contentType: 'application/json'
    }).done(function( data, textStatus, jqXHR ) {
        // logic here to get {id} value
        window.location = "/members/{id}/courses/manage"
    });

Добавьте лог c для ввода значения действительного идентификатора в запросе {id} из формы ввода.

Также на заметке у вас есть жестко закодированный 1 в return "redirect:/members/1/courses/manage";

@PutMapping("/courses/{id}/edit")
public String editCourse(@PathVariable Long id, @RequestBody CourseDto courseDto) {
    return "redirect:/members/1/courses/manage";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...