9
votes

De toute façon d'envoyer% 2b (codé signe plus) dans la requête arg avec java.net.URI?

Je n'arrive pas à trouver cela mentionné explicitement, mais il semble que vous ne puissiez pas envoyer de signe plus évasé ("% 2b") en tant que requête argument de requête si vous utilisez java.net.uri, car La requête Arg est échappée.

URI u = new URI("http://example.com:80/foo?a=%2b");
URI identical = ...; // not identical! http://example.com:80/foo?a=+


1 commentaires

Le défi pour URI est qu'une fois qu'il reçoit la requête comme par exemple argument du constructeur, il est trop tard pour comprendre la sémantique, car la requête est déjà une chaîne avec toutes les paires valeur clé jointes. Comme + est un caractère spécial à RFC 2396 il n'a pas besoin d'être échappé. Par exemple, pouvez utiliser les commandes ? + Touche = + val qui est interprété comme ? Key = val à côté serveur et qui est peut-être l'effet désiré. D'autres constructeurs comme org.springframework.web.util.UriComponentsBuilder travail au niveau sémantique supérieur, peuvent ainsi faire échapper plus intelligent.


3 Réponses :


3
votes

Je lance en même problème. Après quelques recherches, je pense que si vous avez besoin d'un% 2b encodage de symbole plus, il est préférable de ne pas utiliser la classe URI comme résultat. J'utilise le code comme ceci: xxx


0 commentaires


2
votes

Je rencontre ce problème en utilisant Spring 5 de RestTemplate code> qui utilise Apaches HttpClient code> en dessous. Tout ce que je ne je ne pouvais pas envoyer % 2B code> qui était un problème pour les non-standard (ugh ...) API REST Couchbase.

Cette API prévoit des espaces blancs dans les ID de document à échappèrent comme + code> sur l'URL et le littéral plus pour être un % 2B code>. p>

Malheureusement, ProtocolExec code> sur la chaîne d'exécution de la demande HttpClient réécritures tous les URI d'une manière qui ne permettent pas d'envoyer un littéral % 2B code> sur le chemin de l'URI. p>

  • littérales + code> est envoyé comme + code>. Li>
  • % 2B code> est également envoyé comme + code> li>
  • % 252B code> (qui est % 2B code> avec % code> échappé) est envoyé littéralement % 252B code> li> Ul>

    Ma solution, pas loin d'être un hack mais aussi difficile d'éviter, était d'écrire une coutume HttpClientBuilder et insérez un décorateur pour le MainExec code>, qui sera exécuté juste après la ProtocolExec code> est la réécriture. Il ressemble à ceci: p>

    /*
     * This is a hack to circumvent Apache's HttpClient otherwise inevitable URI rewriting. This rewriting made it
     * impossible to send a literal %2B in a query path as it includes a forceful reencoding that doesn't reencode the
     * '+' character. This is necessary because Couchbase decided that they were too good for following standards and
     * decided to use + as meaning " " (whitespace) in URI paths instead of the typical %20.
     *
     * As an ugly solution we wrote an HttpClientBuilder that injects a ClientExecChain that will rewrite the full path
     * turning + to spaces. Maybe future versions will make this easier to accomplish.
     */
    public class CustomHttpClientBuilder extends HttpClientBuilder {
    
        @Override
        protected ClientExecChain decorateMainExec(final ClientExecChain requestExecutor) {
            return (
                    HttpRoute route,
                    HttpRequestWrapper request,
                    HttpClientContext clientContext,
                    HttpExecutionAware execAware) -> {
                UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUri(request.getURI());
                uriComponentsBuilder.replacePath(request.getURI().getRawPath().replace("+", "%2B"));
                request.setURI(uriComponentsBuilder.encode().build(true).toUri());
    
                return requestExecutor.execute(route, request, clientContext, execAware);
            };
        }
    }