0

Restlet 2.1 for Java EEを使用して、属性を処理する機能に興味深い問題があることを発見しました。

次のようなコードがあるとします。

cmp.getDefaultHost().attach("/testpath/{attr}",SomeServerResource.class);

ブラウザで次のURLを指定します。

http://localhost:8100/testpath/command

もちろん、attr属性は「command」に設定されます。

残念ながら、次のURLのように、属性をcommand/testのようなものにしたいとします。

http://localhost:8100/testpath/command/test

または、次のように、さまざまなレベルで動的に追加する場合。

http://localhost:800/testpath/command/test/subsystems/network/security

どちらの場合も、attr属性は「コマンド」に設定されたままです。

レストレットアプリケーションに「スラッシュ」を保持できる属性を作成する方法はありますか。たとえば、attr属性を「command / test」に設定できますか?テストパスの後にすべてを取得し、文字列全体を属性にできるようにしたいと思います。

これは可能ですか?誰かアドバイスしてください。

4

2 に答える 2

1

これは、URLエンコードを使用して行うことができます。

ルーターに次の添付ファイルを作成しました。

router.attach("/test/{cmd}", TestResource.class);

私のテストリソースクラスは、Apache Commons Codec URLCodecの助けを借りて、次のようになります。

@Override
protected Representation get() {
    try {
    String raw = ResourceWrapper.get(this, "cmd");
    String decoded = new String(URLCodec.decodeUrl(raw.getBytes()));
    return ResourceWrapper.wrap(raw + " " + decoded);
    } catch(Exception e) { throw new RuntimeException(e); }
}

私のリソースラッパークラスは単なるユーティリティメソッドであることに注意してください。getはurlparamの文字列を返し、wrapはStringRepresentationを返します。

今、私がこのようなことをすると:

http://127.0.0.1/test/haha/awesome

404を取得します。

代わりに、私はこれを行います:

http://127.0.0.1/test/haha%2fawesome

フォルダパスをURLEncodedしました。これにより、ブラウザに次のように表示されます。

haha%2fawesome haha/awesome

1つ目は生の文字列、2つ目は結果です。単純な例であるため、これがニーズに適しているかどうかはわかりませんが、属性をURLEncodeする限り、もう一方の端でデコードできます。

于 2012-12-06T19:31:04.540 に答える
1

同じ場合、私は通常、変数のタイプを変更します。

Route route = cmp.getDefaultHost().attach("/testpath/{attr}",SomeServerResource.class);
route.getTemplate().getVariables().get("attr") = new Variable(Variable.TYPE_URI_PATH);
于 2012-12-18T00:42:23.117 に答える