3
votes

@RequestParam ne mappe pas la chaîne entière

J'ai un point de terminaison Get qui accepte une chaîne de requête comme paramètre de requête. Le problème avec le point de terminaison est que la chaîne de paramètres de requête peut contenir des caractères tels que?, / Etc, ce qui pose des problèmes.Y a-t-il un moyen de mapper une chaîne contenant?, / Etc à une variable dans un contrôleur de repos?

déjà essayé d'utiliser @PathVariable au lieu d'utiliser @RequestParam mais il ne lit toujours pas la valeur correctement. Lorsque vous utilisez @PathVariable pour mapper l'URI, le? est omis. Lorsque vous utilisez @RequestParam, cela lance une exception.Stacktrace est fourni.

@GetMapping("/getResult")
public @ResponseBody ResponseEntity<String> getData(@RequestParam(value="text") String text) {
    //Call to service layer passing text as a param
    return new ResponseEntity<String>("GET Response", HttpStatus.OK);
}

URL : 'localhost/getResult?text=How you doing?'

Stacktrace:

java.lang.IllegalArgumentException: caractère non valide trouvé dans la méthode Nom. Les noms de méthode HTTP doivent être des jetons Erreur lors de l'analyse de la requête HTTP en-tête Remarque: d'autres occurrences d'erreurs d'analyse d'en-tête HTTP seront connecté au niveau DEBUG.

java.lang.IllegalArgumentException: caractère non valide trouvé dans la méthode Nom. Les noms de méthode HTTP doivent être des jetons à org.apache.coyote.http11.Http11InputBuffer.parseRequestLine (Http11InputBuffer.java:422) ~ [tomcat-embed-core-8.5.14.jar: 8.5.14] à org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:683) ~ [tomcat-embed-core-8.5.14.jar: 8.5.14] à org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.14.jar: 8.5.14] à org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:861) [tomcat-embed-core-8.5.14.jar: 8.5.14] à org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1455) [tomcat-embed-core-8.5.14.jar: 8.5.14] à org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) [tomcat-embed-core-8.5.14.jar: 8.5.14] à java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) [na: 1.8.0_05] à java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) [na: 1.8.0_05] à org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) [tomcat-embed-core-8.5.14.jar: 8.5.14] à java.lang.Thread.run (Thread.java:745) [nd: 1.8.0_05]

Pour le résultat attendu, je voudrais mapper la chaîne "Comment ça va?" à une variable de chemin ou à une variable de paramètre de requête avec la chaîne entière intacte, au lieu du '?' être omis.


1 commentaires

Vous devez encoder la chaîne avant de l'envoyer au serveur.


4 Réponses :


2
votes

Encodez le point d'interrogation (?) comme % 3F et vous êtes prêt à partir.

Il n'y a pas d'autre moyen d'envoyer un point d'interrogation dans une requête car il s'agit d'un caractère spécial .


4 commentaires

Oui, mais assurez-vous de n'encoder que les paramètres, pas l'URL entière!


% 3F est une représentation du point d'interrogation, j'espère que vous l'avez compris. Chaque caractère spécial doit être codé. Regardez ici: secure.n-able .com / webhelp / NC_9-1-0_SO_en / Content / SA_docs /…


En outre, vous devez utiliser une bibliothèque pour encoder des chaînes et ne pas gérer cela vous-même.


J'ai compris que les paramètres de requête devaient être encodés car j'utilisais postman pour atteindre le point de terminaison et non via ajax.



3
votes

Fournir une solution Java:
Vous pouvez utiliser URLEncoder pour obtenir ce que vous voulez:

URLEncoder enc = new URLEncoder();
enc.encode(String toEncode, String charset)

Il existe aussi une méthode qui n'accepte que la chaîne à encoder, mais celle-ci est obsolète.

Si vous appelez depuis un client Javascript, vous pouvez utiliser encodeURIComponent () :

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent


0 commentaires

4
votes

Si vous appelez l'url directement à partir du navigateur, de curl ou du facteur. vous devez utiliser le codage pour différents caractères spéciaux comme pour le codage de l'espace est% 20. Cela signifie que lorsque vous écrivez "comment allez-vous?" , ce serait "how%20are%20you%3F" dans l'URL. Veuillez consulter ce site pour en savoir plus.

Et si l'appel provient de n'importe quel langage de programmation. veuillez utiliser des encodeurs d'URL.


0 commentaires

0
votes

Vous devez encoder les paramètres avec des caractères spéciaux dans l'URL. Vous pouvez utiliser encodeURIComponent depuis le front-end.

Si vous utilisez postman, vous devez définir ce qui suit dans les scripts de pré-demande,

var encoded = encodeURIComponent(postman.getEnvironmentVariable("text"));
postman.setEnvironmentVariable("encoded text", encoded);

p >


0 commentaires