Spring MVC mit @ RequestParam mit RequestMethod.DELETE auf Tomcat 6.0.35

8

Ich habe eine einfache Methode (läuft auf Tomcat 6.0.35), die so aussieht:

%Vor%

Wenn ich eine DELETE-Anfrage mit post-ähnlichen Parametern (d = gggg im Body) sende, bekomme ich eine 400 Bad Request. Aber wenn ich es zu

ändere %Vor%

Es funktioniert perfekt. Ich benutzte ein Firefox-Add-on, um es zu testen (und Python und Spring's RestTemplate mit demselben Ergebnis). Hier ist, wie die Anfrage mit POST aussieht (a ist eine kopierte eingefügte Methode namens a mit Parameter a):

%Vor%

Und Löschen sieht wie folgt aus:

%Vor%

Bitte hilf mir, ich könnte etwas dummes vermissen, aber ich kann es einfach nicht sehen. Mein ursprüngliches Problem war das Senden eines Arrays über Post-Like-Körper mit DELETE-Anfrage, aber es scheint, dass etwas Grundlegenderes falsch ist.

    
Scis 12.06.2012, 09:41
quelle

3 Antworten

14

Nun, nachdem ich etwas recherchiert und debuggt habe, habe ich herausgefunden, dass ServletWebRequest von Spring getParameterValues ​​von org.apache.catalina.connector.RequestFacade.getParameterValues ​​aufruft, welches getParameterValues ​​aufruft, in dem ich die folgende Zeile gefunden habe (Request.java 2599- 2600):

%Vor%

Was jeden Versuch, POST-ähnliche Parameter zu senden, mit DELETE beendet, was bedeutet, dass Tomcat diesen Anwendungsfall aktiv einschränkt, obwohl der RFC schränkt solche Verwendung nicht ein (obwohl es heißt, dass einige existierende Implementierungen solche Anfragen ablehnen könnten, wirft Tomcat einfach seine Parameter weg). Was bringt einen, der Spring und Tomcat verwendet und versucht, eine DELETE-Anfrage mit Parametern an hässliche Lösungen wie den gesamten Anfragekörper mit @RequestBody zu schicken und ihn manuell zu extrahieren, was Ihre angeblich unschuldige Methode macht, die nur etwas von einer Map löschen möchte das enthält den Anfragetext.

@fmucar

    
Scis 13.06.2012, 14:05
quelle
0

Ich hatte ein ähnliches Problem und die gefundene Lösung bestand darin, die Felder in die Abfragezeichenfolge einzufügen. Ich möchte immer noch die Gründe wissen, warum ein Formularkörper auf diese Weise ausgeschlossen werden würde, aber für den Moment ist dies ein Workaround.

Für Ihr Beispiel würde das Hinzufügen bedeuten     ? a = asdas an den Gastgeber: ~~~~~: 8080 URL.

Ich benutze spring-webmvc: 3.2.4.RELEASE, also bin ich mir nicht sicher, ob das in deiner Version funktioniert oder nicht.

    
gaoagong 08.08.2014 00:08
quelle
0

Dies ist ein ziemlich alter Post, aber falls jemand anders nach @RequestParam bei DELETE-Methoden sucht, habe ich das mit Tomcat 8.5.4 gemacht.

%Vor%

Schließen Sie 'POST, DELETE' an diesen Customizer an, und Ihre Löschanforderungsparameter sollten anfangen zu arbeiten.

Ich habe parseBodyMethods in org.apache.catalina.connector.Connector gefunden, und hier ist Tomcat's Dokumentation:

  

Dies ist nützlich in RESTful-Anwendungen, die eine POST-ähnliche Semantik für PUT-Anforderungen unterstützen wollen. Beachten Sie, dass jede andere Einstellung als POST dazu führt, dass Tomcat sich so verhält, dass es der Absicht der Servlet-Spezifikation widerspricht. Die HTTP-Methode TRACE ist hier ausdrücklich gemäß der HTTP-Spezifikation verboten. Der Standardwert ist POST ( Quelle )

    
Daniel 09.12.2016 22:11
quelle

Tags und Links