Ich arbeite an einem Spring-Projekt. Hier ist mein Grund Controller:Redirect nach einem POST vs Redirect nach einem 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);
}
Von web.xml:
<servlet-mapping>
<servlet-name>edm</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Ich habe Anlegesteg eingebettet und ich versuche, einen Integrationstest:
@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());
}
Also, wenn ich die oben ausführen es funktioniert gut und ich bekomme ein grünes OK-Zeichen.
Nun akzeptiert der Controller POST- und GET-Methoden. Wenn ich den Test mit GET-Methode ausführen (als Ersatz für HttpMethod.POST mit HttpMethod.GET), wird das Ergebnis sein, um ein 404.
Die Protokolle zeigen:
WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/edm/editor/pad.html] in DispatcherServlet with name 'edm'
Ich habe versucht, die Anwendung zu debuggen up zum DispatcherServlet und seltsame Sache ist, dass mit GET, nach der 302/Redirect Antwort der Dispatcher wieder aufgerufen wird und dies zu einem 200 - keine Ahnung wie und warum.
Keine Antwort, aber die vernünftige Sache zu tun wäre für Bearbeitung immer ein POST sein. –
@NathanHughes Wenn Sie es als eine tatsächliche Dokumentbearbeitung betrachten, haben Sie recht - vielleicht ist die Benennung nicht die beste. Allerdings wird "/ editor" nach einer Umleitung von einem anderen Dienst aufgerufen (und es werden keine Änderungen/Bearbeitungen angewendet), also muss es ein GET sein. – Michael