JAX-RS и неизвестные параметры запроса - PullRequest
5 голосов
/ 03 октября 2011

У меня есть клиент Java, который вызывает сервер Java RESTEasy (JAX-RS). Возможно, что некоторые из моих пользователей могут иметь более новую версию клиента, чем сервер.

Этот клиент может вызвать на сервере ресурс, содержащий параметры запроса, о которых сервер не знает. Можно ли обнаружить это на стороне сервера и вернуть ошибку?

Я понимаю, что если клиент вызывает URL-адрес, который еще не был реализован на сервере, клиент получит ошибку 404, но что произойдет, если клиент передаст параметр запроса, который не был реализован (например: ?sort_by=last_name)

Ответы [ 2 ]

5 голосов
/ 04 октября 2011

Можно ли обнаружить это на стороне сервера и вернуть ошибку?

Да, вы можете сделать это. Я думаю, что самый простой способ - использовать @Context UriInfo. Вы можете получить все параметры запроса, вызвав метод getQueryParameters(). Таким образом, вы знаете, есть ли какие-либо неизвестные параметры, и вы можете вернуть ошибку.

но что произойдет, если клиент передаст параметр запроса, который не реализован

Если вы не реализуете специальную поддержку обработки «неизвестных» параметров, ресурс будет вызван, а параметр будет игнорироваться.

Лично я считаю, что лучше игнорировать неизвестные параметры. Если вы просто игнорируете их, это может помочь сделать API обратно совместимым.

0 голосов
/ 31 октября 2012

Вы обязательно должны проверить фильтры JAX-RS (org.apache.cxf.jaxrs.ext.RequestHandler), чтобы перехватывать, проверять, манипулировать запросом, например, для параметров запроса безопасности или проверки.

Если выобъявив все ваши параметры с помощью аннотаций, вы можете проанализировать файл web.xml для имен классов ресурсов (см. возможное регулярное выражение ниже) и использовать полные квалифицированные имена классов для доступа к объявленным аннотациям для методов (например, javax.ws.rs.GET) иПараметры метода (например, javax.ws.rs.QueryParam) для сканирования всех доступных ресурсов веб-службы - таким образом, вам не нужно вручную добавлять все классы ресурсов в ваш фильтр.Сохраните эту информацию в статических переменных, так что вам просто нужно проанализировать этот материал при первом обращении к фильтру.

В вашем фильтре вы можете получить доступ к org.apache.cxf.message.Message для входящего запроса.Строка запроса проста для доступа - если вы также хотите проверить параметры формы и составные имена, вам необходимо повторно просмотреть содержимое сообщения и записать его обратно в сообщение (это становится немного неприятно, поскольку вам приходится иметь дело с границами составных частей и т. Д.).

Чтобы «проиндексировать» ресурсы, я просто беру метод HTTP и добавляю путь (который затем используется в качестве ключа для доступа к объявленным параметрам.

Вы можете использовать ServletContext для чтенияФайл web.xml. Для извлечения классов ресурсов может пригодиться это регулярное выражение

String webxml = readInputStreamAsString(context.getResourceAsStream("WEB-INF/web.xml"));
Pattern serviceClassesPattern = Pattern.compile("<param-name>jaxrs.serviceClasses</param-name>.*?<param-value>(.*?)</param-value>", Pattern.DOTALL | Pattern.MULTILINE);
...