5

コンポーネントでこのコードを使用して、複数のルートを作成しました。

Component component = new Component();
component.getServers().add(Protocol.HTTP, port);
component.getDefaultHost().attach(pair.uriPattern, pair.restlet);
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet());

ハートビート コードが機能します。

しかし、pair.restlet上記のようにルーターを使用すると機能しません。

Router router = new Router();
Restlet fooHandler = new FooRouter();
Restlet barHandler = new BarRouter();

router.attach("/foo/{fooId}", fooHandler);
router.attach("/bar/{barId1}/{barId2}", barHandler);

ApplicationRestlet doc は、次のクラスでルーターを使用する例のみを示しています。

public class FirstStepsApplication extends Application {

    @Override
    public synchronized Restlet createInboundRoot() {
        Router router = new Router(getContext());
        router.attach("/hello", HelloWorldResource.class);
        return router;
    }
}

実際にルーターベースのコードを使用すると、存在しない URL にアクセスした場合と同じ効果が得られます。

だから私は尋ねています:

  1. ルーターベースのアプローチとコンポーネントベースのアプローチで達成すべきことの間に違いはありますか?
  2. ルーターベースのアプローチを使用してこのコードを機能させることはできますか? 今のところ、私の唯一の解決策は、複数のルーターを廃棄して代わりに複数のコンポーネントを接続することです。これには、より多くのレガシー コードを処理する必要があります。
4

1 に答える 1

1

Restlet では要素を複合してリクエスト処理チェーンを構築できるため、仮想ホスト アタッチメントでルーターを使用しても問題はありません。

ここでの問題は、ルーターが複数のルートをサポートでき、完全一致モード (実際にはデフォルトのモード) を使用することです。

サンプルを取ってみましょう。pair.uriPatternが含まれ/testていて、このルートにルーターが接続されている場合。ルーターで指定したものに関係なく、パスのみ/testが処理されます (空のルートを除く;-)

サブルートのマッチングを実装したいと思うので、ルーターを仮想ホストに接続するときにマッチングで開始を使用することを検討する必要があります。

Router router = (...)

Component component = new Component();
component.getServers().add(Protocol.HTTP, port);
component.getDefaultHost()
             .attach(pair.uriPattern, router)
             .setMatchingMode(Template.MODE_STARTS_WITH);
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet());

この場合、 の値で始まるすべてのリクエストがpair.uriPatternルーターによって処理されます。したがって、ルーターは次のように定義する必要があります。

Router router = new Router();
router.attach("/something", yourRestlet1);
router.attach("/somethingelse", yourRestlet2);

この場合、次の動作になります。

  • ルートpair.uriPattern + "/something"はで処理されますyourRestlet1
  • ルートpair.uriPattern + "/somethingelse"はで処理されますyourRestlet2

実際、このようなアプローチは、アプリケーションのコードを整理する優れた方法です。

お役に立てば幸いです、ティエリー

于 2015-06-15T08:34:00.517 に答える