Beachten Sie, dass ich von den Spezifikationen von WebTarget.queryParam () des JAX-RS-Clients abhängig war.
Klicken Sie hier, um die Spezifikationen von WebTarget.queryParam () anzuzeigen (https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/WebTarget.html#queryParam-java.lang.String-java). lang.Object ...-). Es ist eine Methode zum Festlegen von Abfrageparametern für WebTarget.
Diese Methode und die URI-Codierung weisen eine Einschränkung auf.
Die URI-Vorlage ist eine Funktion, die den Pfadparameter in den von {} umgebenen Teil einfügt. Wenn Sie jedoch darüber nachdenken, liegt ein kleines Problem vor. Das Problem ist, dass der Abfrageparameterwert nicht "{" oder "}" selbst enthalten kann. Dies liegt daran, dass sowohl "{" als auch "}" als Pfadparameter interpretiert werden.
Um dies zu vermeiden, müssen "{" und "}" URI-codiert sein. Dies bedeutet, dass es% 7b bzw.% 7d sein sollte.
In Implementierungen wie Jersey und RESTEasy führt diese Methode jedoch eine URI-Codierung wie oben beschrieben durch. Wenn sie also wie sie ist erneut URI-codiert wird, sollte sie in% 257b und% 257d konvertiert werden. Mit anderen Worten, wenn Sie {oder} nicht verwenden können, ...?
Die Jersey-Implementierung vermeidet eine doppelte URI-Codierung, um dies zu vermeiden. Insbesondere lautet die Regel, dass% nicht codiert wird, wenn nach% zwei aufeinanderfolgende Hexadezimalzeichen (0-9a-fA-F) stehen. Es ist also in Ordnung, {,} so zu codieren, wie es ist.
Wenn Sie dagegen nach% zwei aufeinanderfolgende Hexadezimalzeichen haben, wird% nicht URL-codiert.
Daher ist es besser, sich vor dem Aufruf von queryParam () ** immer mit URI zu codieren.
Ich weiß nicht, was die anderen Implementierungen tun. Auf den ersten Blick scheint der RESTEasy-Code% überhaupt nicht codiert zu sein.
Das obige Verhalten kann natürlich nicht aus den JAX-RS-Spezifikationen gelesen werden (implementierungsabhängig). Überprüfen wir also den Vorgang, bevor wir ihn verwenden.
Recommended Posts