JAX-RS и неизвестные параметры запроса
У меня есть Java-клиент, который вызывает сервер Java RESTEasy (JAX-RS). Возможно, что некоторые из моих пользователей могут иметь более новую версию клиента, чем сервер.
Этот клиент может вызвать ресурс на сервере, содержащий параметры запроса, о которых сервер не знает. Возможно ли обнаружить это на стороне сервера и вернуть ошибку?Я понимаю, что если клиент вызывает URL, который еще не был реализован на сервере, клиент получит ошибку 404, но что произойдет, если клиент передаст в запросе параметр, который не реализован (например: ?sort_by=last_name
)?
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);