JAX-RS и неизвестные параметры запроса


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

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

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

2 4

2 ответа:

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

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

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

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

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

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

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

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

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

Вы можете использовать ServletContext для чтения веб-страниц.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);