2013-07-24 3 views
4

Я новичок в разработке веб-сервисов на Java (ранее я делал их в PHP и Ruby). Я пишу ресурс, который имеет следующий формат:Java - лучший способ проанализировать URL ресурса RESTful

<URL>/myService/<domain>/<app_name>/<system_name> 

Как вы можете видеть, я получил идентификатор ресурса на три уровня, и я пытаюсь выяснить, лучший способ для синтаксического анализа его , Приложение, к которому я добавляю эту новую услугу, не использует Джерси или какие-либо RESTful-структуры, подобные этому. Вместо этого он просто расширяет HttpServlet.

В настоящее время они следуют алгоритм, как это:

  • Вызов request.getPathInfo()
  • Заменить символ «/» в информации о пути с «» characters
  • Используйте методы String.substring для извлечения отдельных частей информации для этого ресурса из строки pathInfo.

Это не очень элегантно для меня, и я ищу лучший способ. Я знаю, что использование пакета javax.ws.rs делает это очень просто (используя аннотации @Path и @PathParam), но использование Джерси, вероятно, не является вариантом.

Используя только базовый объект HttpServletRequest и стандартные библиотеки Java, есть ли лучший способ проанализировать эту информацию, чем метод, описанный выше?

+1

Вы можете просто иметь несколько сервлетов отображаются на разные адреса. Возможно, один для каждого ресурса. –

ответ

0

Я считаю, что сначала вам нужно создать фреймворк для хранения методов REST и сопоставлений классов + в файле свойств или в структуре данных памяти. Затем напишите сервлет верхнего уровня, который примет весь ваш запрос REST. В зависимости от URL-адреса, начинающегося с вашего контекста, вы можете попытаться получить сопоставление из вашего файла свойств/в структуре данных памяти, чтобы узнать, какой класс и какой из его методов нужно вызывать. Затем, используя отражение, вы можете вызвать желаемый метод. Возьмите ответ метода и переместите его в желаемый формат содержимого и отправьте обратно в выходной поток ответа сервлета.

2

У меня была такая же проблема, как у вас, и, поскольку я не нашел подходящей библиотеки, я решил написать URL-RESTify. Вы можете использовать его или просто взглянуть на собственное решение, это небольшой проект.

2

Я недавно решил эту проблему в одном из моих приложений. Мои URL-адреса выглядят так.

/categories/{category}/subcategories/{subcategory} 

Моя проблема заключалась в том, что я хотел отобразить каждый шаблон URL-адреса с классом Java, так что я мог бы призвать соответствующего класса для отображения данных.

В моем приложении используется Netty, но в URL-адресе не используются сторонние библиотеки.

Это позволяет мне проанализировать URL-адрес, который поступает из браузера, создать карту, содержащую пары ключ-значение (в данном случае категорию и подкатегорию), а также создать экземпляр правильного обработчика для каждый уникальный шаблон URL. Всего всего около 150 строк кода Java для синтаксического анализа, настройки приложения и определения уникальных шаблонов URL.

Вы можете просмотреть код для разрешения имен в GitHub: https://github.com/joachimhs/Contentice/blob/master/Contentice.api/src/main/java/no/haagensoftware/contentice/util/URLResolver.java

UrlResolver.getValueForUrl возвратит URLData с информацией, которую вы требуете о вашей URL: https://github.com/joachimhs/Contentice/blob/master/Contentice.api/src/main/java/no/haagensoftware/contentice/data/URLData.java

После этого настройка, можно связать URL-адрес с Нетти обработчиками:

this.urlResolver.addUrlPattern("/categories", CategoriesHandler.class); 
this.urlResolver.addUrlPattern("/categories/{category}", CategoryHandler.class); 
this.urlResolver.addUrlPattern("/categories/{category}/subcategories", SubCategoriesHandler.class); 
this.urlResolver.addUrlPattern("/categories/{category}/subcategories/{subcategory}", SubCategoryHandler.class); 

Внутри моих обработчиков я могу просто получить параметр карта:

String category = null; 
logger.info("parameterMap: " + getParameterMap()); 
if (getParameterMap() != null) { 
    category = getParameterMap().get("category"); 
} 

Я надеюсь, что помогает :)

+2

Ваши URL-адреса мертвы – frostymarvelous

8

Как насчет джерси UriTemplate?

import com.sun.jersey.api.uri.UriTemplate; 

... 

String path = "/foos/foo/bars/bar"; 

Map<String, String> map = new HashMap<String, String>(); 
UriTemplate template = new UriTemplate("/foos/{foo}/bars/{bar}"); 
if(template.match(path, map)) { 
    System.out.println("Matched, " + map); 
} else { 
    System.out.println("Not matched, " + map); 
}  
+1

То же самое, что и совпадение, мы можем использовать его для создания 'url' путем замены значений переменных (например, '{foo}') –

1

UriTemplate Джерси упоминалось в других ответах это хорошо, но это большая библиотека, и он также включает в себя множество других библиотек зависимостей.

Крошка решение, без зависимости: https://github.com/xitrum-framework/jauter

Смежные вопросы