Я работаю над проектом Spring. Вот мой основной контроллер:Перенаправление после POST против перенаправления после GET
@Controller
public class Editor {
private static final String EDITOR_URL = "/editor";
@RequestMapping(value = EDITOR_URL, method = {POST, GET})
public ModelAndView edit(HttpServletResponse response,
HttpServletRequest request,
RedirectAttributes redirectAttributes,
@RequestParam Map<String, String> allRequestParams) {
// The code is trimmed to keep it short
// It doesn't really matter where it gets the URL, it works fine
String redirectURL = getRedirectUrl();
// redirectURL is going to be /editor/pad.html
return new ModelAndView("redirect:" + redirectUrl);
}
От web.xml:
<servlet-mapping>
<servlet-name>edm</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Я молы встроенные и я пытаюсь тест интеграции:
@Test
public void redirectToEditPadSuccess() throws Exception {
HttpHeaders requestHeaders = new HttpHeaders();
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(END_POINT + "/edm/editor")
.queryParam("param1", "val1")
.queryParam("param2", "val2");
HttpEntity<?> entity = new HttpEntity<>(requestHeaders);
HttpEntity<String> response = restTemplate.exchange(
builder.build().encode().toUri(),
HttpMethod.POST,
entity,
String.class);
HttpHeaders httpResponseHeaders = response.getHeaders();
List<String> httpReponseLocationHeader = httpResponseHeaders.get("Location");
assertTrue(httpReponseLocationHeader.size() == 1);
String redirectLocation = httpReponseLocationHeader.get(0);
URL redirectURL = new URL(redirectLocation);
assertEquals("/edm/editor/pad.html", redirectURL.getPath());
}
Так что, когда я исполняю выше он отлично работает, и я получаю зеленый знак OK.
Теперь контроллер принимает методы POST и GET. Если я выполнить тест с помощью метода GET (заменяющий HttpMethod.POST с HttpMethod.GET), то результат будет 404.
Журналы показывают:
WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/edm/editor/pad.html] in DispatcherServlet with name 'edm'
Я пытался отладить приложение вверх к DispatcherServlet и странно, что с GET после ответа 302/redirect Диспетчер снова вызывается и превращает это в 200 - не знаю, как и почему.
Не ответ, но разумным было бы для редактирования всегда быть POST. –
@NathanHughes Если вы думаете об этом как о фактическом редактировании документа, вы правы - возможно, именование не самое лучшее. Однако «/ editor» будет вызван после перенаправления из другой службы (и на самом деле он не будет применять какие-либо изменения/редактировать в любом месте), поэтому он должен быть GET. – Michael