2016-11-30 18 views
1

Ich habe folgende URLUmgang mit Sonderzeichen in REST API

http://context_path/info/abc/def 

die wie

http://context_path/info/abc%2Fdef 

umgewandelt wird Wo, wie mein Controller-Mapping ist:

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET) 

hier ‚id ' enthält Schrägstrich (/). Wenn ich also auf die URL klicke, bekomme ich 400 Bad Request.

Ich kenne die möglichen Lösungen

  • Einstellung Kater nach vorn ermöglichen zu zerschneiden.
  • Verwenden Sie die URL-Codierung.
  • Verwendung von @RequestParam anstelle von @PathVariable.

Aber obige Lösung sind für mich nicht möglich.

Q. Gibt es eine andere Lösung wie (mit regulären Ausdruck oder Ändern der Zuordnung oder irgendetwas anderes) auf das Problem? Auch wie der Tomcat andere Sonderzeichen behandelt ('.', '' ',': ',', ') korrekt und Controller wird aber nicht für '/'.

versucht, aber nicht funktioniert:

1) @RequestMapping(value = "/info/{id:.*}", method = RequestMethod.GET) 
2) @RequestMapping(value = "/info/{id}/**", method = RequestMethod.GET) 
3) @RequestMapping(value = "/info/**", method = RequestMethod.GET) 
+0

Mögliche Duplikat [Das Spiel "Rest der URL" mit Sp Ring 3 RequestMapping Annotation] (http://stackoverflow.com/questions/4542489/match-the-rest-of-the-url-using-spring-3-requestmapping-annotation) – user1211

+0

Aber warum gibt es einen Schrägstrich in Ihrer ID Wert? – ScanQR

+0

@TechBreak Ich weiß es falsch. aber ich arbeite an alten Werten und kann diese nicht ändern. – SuhasD

Antwort

1

Es ist nicht nett, aber Sie können Base64 transformation verwenden.

So senden Sie Client eine codierte id und Sie dekodieren es zurück in Ihrem Controller.

import org.apache.commons.codec.binary.Base64; 

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET) 
public String get(@PathVariable String id) { 
    final String realId = new String(new Base64(true).encodeBase64URLSafe(id)); 
    [...] 
} 

EDIT: Sie sollten url speichern Implementierung von Base64 verwenden:

+0

Das wird nicht funktionieren. Spring wird die Mapping-URL dekodieren oder nicht anzeigen und dann versuchen, die Handler-Methode basierend auf der resultierenden URL aufzurufen. Daher wird es als schlechte Anfrage zurückkehren. – ScanQR

+0

@TechBreak hast du es versucht? Ich bin jetzt versucht und es funktioniert. – dit

+0

@dit Base64 funktioniert gut, aber geben Sie es nur aus, wenn die ID '?' dann konvertiert es es in '/'. Irgendein anderer Kodierer, der nicht '/' zum Kodieren benutzt? – SuhasD

-1
+0

Ich fügte hinzu, Reg-EX [\\ [\\] A-Za-z0-9 \ "',(): ._^-] +. Es funktioniert für alle anderen Sonderzeichen außer '/' und wenn ich oben Reg-EX modifiziere wie [\\/\\ [\\] A-Za-z0-9 \ "',(): ._^-] + dann keine URL funktioniert (auch die, die mit alten Reg-EX arbeiten) – SuhasD

0

Sie so etwas wie dieses How to handle requests that includes forward slashes (/)?

verwenden können, aber es hat es Einschränkungen ist, würde ich Ihnen vorschlagen, den Schrägstrich mit etwas anderem wie ‚#‘ zu ersetzen, während die api aufrufen und dann wieder ersetzen zurück Schrägstrich vor dem Verarbeiten in Ruhe-Controller weiterleiten.

Wenn Ersetzen während des Aufrufs der API nicht möglich ist, dann können Sie Filter verwenden und die Daten dort ersetzen.

Verwandte Themen