Маршрут перезапуска - маршрут обгоняется другим маршрутом
Я столкнулся со странной проблемой маршрутизации в рестлете. Я использую Android.
Этот класс extends Router
Это мой код маршрутизации:
this.attach("/contacts", contactListRestlet); // To list all contacts
this.attach("/contacts/{uid}", contactRestlet); // To show details about a specific contact
this.attach("/contacts/similar", similarRestlet, Template.MODE_EQUALS);
this.attach("/contact/photo/{uid}", photoRestlet); // {uid} must correspond to a valid raw contact id
this.attach("/contact/photo/{uid}/thumbnail", photoThumbnailRestlet);
this.attach("/import/file", fileImportRestlet);
this.attach("/echo", echoRestlet);
this.attach("/echo/file", echoFileRestlet);
this.attach("/import/vcard", importVcard);
this.attach("/logout", logoutRestlet);
final String ROOT_URI = "file:///android_asset";
Application application = new Application() {
@Override
public Restlet createInboundRoot() {
//ForAssets
DirectoryForAssets d = new DirectoryForAssets(getContext(), ROOT_URI);
d.setTargetClass(DirectoryResourceExtension.class);
d.setAndroidContext(context);
return d;
}
};
this.attach("/editor", application, Template.MODE_STARTS_WITH);
таким образом, если я ударил ip:port/contacts/similar
Меня всегда перенаправляют на /contacts restlet
(contactRestlet
) и не /contacts/similar restlet
(similarRestlet
) как я и ожидал.
Но если я изменю это на:
this.attach("/contacts/similar", similarRestlet);
this.attach("/contacts", contactListRestlet); // To list all contacts
this.attach("/contacts/{uid}", contactRestlet); // To show details about a specific contact
this.attach("/contact/photo/{uid}", photoRestlet); // {uid} must correspond to a valid raw contact id
this.attach("/contact/photo/{uid}/thumbnail", photoThumbnailRestlet);
this.attach("/import/file", fileImportRestlet);
this.attach("/echo", echoRestlet);
this.attach("/echo/file", echoFileRestlet);
this.attach("/import/vcard", importVcard);
this.attach("/logout", logoutRestlet);
final String ROOT_URI = "file:///android_asset";
Application application = new Application() {
@Override
public Restlet createInboundRoot() {
//ForAssets
DirectoryForAssets d = new DirectoryForAssets(getContext(), ROOT_URI);
d.setTargetClass(DirectoryResourceExtension.class);
d.setAndroidContext(context);
return d;
}
};
this.attach("/editor", application, Template.MODE_STARTS_WITH);
это работает! (Разница лишь в том, что подобный Restlet стоит первым, чем contactRestlet).
Может кто-нибудь объяснить мне, почему это поведение? Что я делаю неправильно?
2 ответа
По умолчанию маршрутизатор сопоставляет первое доступное совпадение, существуют другие режимы сопоставления, включая наилучшее совпадение. Это можно настроить, изменив setDefaultMatchingMode(int)
См. Рестлет JavaDoc для получения дополнительной информации. В настоящее время на http://restlet.com/technical-resources/restlet-framework/javadocs/2.3/jse/api/org/restlet/routing/Router.html
"/contacts/{uid}"
"/contacts/similar"
Если у вас есть эта последовательность выше, она будет использовать {uid} и заполнять "хожие ", потому что она не может различить оба и использует" похожие "в качестве"uid".
Итак, когда вы говорите так:
"/contacts/similar"
"/contacts/{uid}"
Сначала он ловит слова "похожие", и если он не "похож", он использует эту часть в качестве идентификатора пользователя.