57

クエリ/マトリックス パラメータの値として URI を送信したいと考えています。既存の URI に追加する前に、RFC 2396 に従ってエンコードする必要があります。たとえば、入力が与えられた場合:

http://google.com/resource?key=value1 & value2

出力が期待されます:

http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2

どちらjava.net.URLEncoderjava.net.URI正しい出力を生成しません。URLEncoderRFC 2396 とは異なる HTML フォーム エンコーディング用です。URI一度に 1 つの値をエンコードするメカニズムがないため、value1 と value2 が同じキーの一部であることを知る方法がありません。

4

7 に答える 7

31

Jersey のUriBuilderは、必要に応じて application/x-www-form-urlencoded および RFC 3986 を使用して URI コンポーネントをエンコードします。Javadocによると

ビルダー メソッドは、クエリ パラメーターの application/x-www-form-urlencoded メディア タイプの規則と、他のすべてのコンポーネントの RFC 3986 の規則に従って、対応する URI コンポーネントで許可されていない文字のコンテキスト エンコーディングを実行します。特定のコンポーネントで許可されていない文字のみがエンコードされることに注意してください。たとえば、いずれかのパス メソッドに指定されたパスには、マトリックス パラメーターまたは複数のパス セグメントが含まれる場合があります。これは、区切り文字が有効な文字であり、エンコードされないためです。パーセントでエンコードされた値も許可されている場合は認識され、二重にエンコードされることはありません。

于 2009-01-14T20:39:17.337 に答える
20

Spring のUriUtilsを使用することもできます

于 2011-07-16T03:48:28.357 に答える
9

回答についてコメントするほどの評判はありませんが、JSR-311 API を単独でダウンロードしても機能しないことに注意してください。リファレンス実装 ( jersey )をダウンロードする必要があります。

JSR ページから API をダウンロードするだけでは、API が実行時に実装を探そうとすると ClassNotFoundException が発生します。

于 2009-12-30T22:05:48.777 に答える
3

私は自分で書きました。短く、非常にシンプルです。必要に応じてコピーできます: http://www.dmurph.com/2011/01/java-uri-encoder/

于 2011-01-17T06:15:59.537 に答える
2

Google GData-java-client のCharEscapersには、必要なものがあるようです。これには、uriPathEscaper メソッド、uriQueryStringEscaper、および汎用 uriEscaper があります。(すべて、実際のエスケープを行う Escaper オブジェクトを返します)。アパッチライセンス.

于 2009-01-14T19:30:01.783 に答える
-2

URI クラスはあなたが探しているものだと思います。

于 2009-01-14T18:33:09.637 に答える
-3

うーん、あなたがすでに URLEncoder を破棄していることは知っていますが、ドキュメントに書かれていることにもかかわらず、試してみることにしました。

あなたが言った:

たとえば、次の入力があるとします。

http://google.com/resource?key=value

出力が期待されます:

http%3a%2f%2fgoogle.com%2fresource%3fkey%3d値

そう:

C:\oreyes\samples\java\URL>type URLEncodeSample.java
import java.net.*;

public class URLEncodeSample {
    public static void main( String [] args ) throws Throwable {
        System.out.println( URLEncoder.encode( args[0], "UTF-8" ));
    }
}

C:\oreyes\samples\java\URL>javac URLEncodeSample.java

C:\oreyes\samples\java\URL>java URLEncodeSample "http://google.com/resource?key=value"
http%3A%2F%2Fgoogle.com%2Fresource%3Fkey%3Dvalue

予想通り。

これには何が問題になりますか?

于 2009-01-14T19:44:19.227 に答える