В этой статье представлено использование клиента Джерси для запроса услуги Spring Boot (RESTFUL) и делится им с вами следующим образом:
Клиент Джерси получает инкапсуляцию экземпляра объекта клиента:
@Service ("JerseyPoolingClient") Общедоступный класс JerseyPoolingClaintorybean Реализует Factorybean <client>, инициализация Bean, OndableBean { /*** Интерфейс клиента является основным интерфейсом клиента REST и используется для общения с сервером REST. Клиент определяется как тяжелый объект, который управляет различными объектами в нижней части связи с клиентом, такими как разъемы, анализаторы и т. Д. Поэтому не рекомендуется генерировать большое количество экземпляров клиента в приложении. Это необходимо в разработке. Кроме того, этот интерфейс требует, чтобы экземпляр был закрыт, в противном случае он приведет к утечке памяти*/ частного клиента; / ** * Максимальное количество соединений для клиента, по умолчанию составляет 2000 */ private int maxtotal = 2000; / *** Максимальное количество подключений по умолчанию по маршруту*/ private int defaultmaxperroute = 1000; Private ClientConfig ClientConfig; public JerseyPoolingClientFactoryBean () {} / *** Конструктор с конфигурацией* @param clientConfig* / public jerseypoolingClientFactoryBean (clientConfig ClientConfig) {this.clientConfig = clientConfig; } public JerseyPoolingClaintorybean (int maxtotal, int defaultmaxperroute) {this.maxtotal = maxtotal; this.defaultmaxperroute = defaultmaxperroute; } / ** * Внимание: * Подробности: выпустить ресурсы клиента, когда контейнер разрушается * @author chhliu * / @override public void destress () выбрасывает исключение {this.client.close (); } / ** * * * * * ClientConfig (); // Экземпляр управления пулом соединений, этот класс безопасен для потока и поддерживает несколько параллельных операций PoolinghttpclientConnectionManager PCM = New PoolingHttpClientConnectionManager (); pcm.setmaxtotal (this.maxtotal); pcm.setdefaultmaxperroute (this.defaultmaxperroute); ClientConfig.property (apacheclientProperties.connection_Manager, PCM); / * * При использовании Jersey для запроса Spring Boot Service Spring Boot использует Jackson для анализа JSON по умолчанию *, в то время как Джерси использует Moxy для разбора JSON по умолчанию. Когда Клиент Джерси хочет, чтобы Spring Boot Service запросил ресурсы,* эта разница приведет к тому, что сервер и клиент по -разному преобразуют POJO, что приведет к ошибкам десериализации* Поэтому вам необходимо зарегистрировать функцию Jackson в экземпляре конфигурации клиента здесь*/ clientConfig.register (jacksonfeature.class); // Использование конфигурации Apache Connector, разъем по умолчанию - httpurlconnector clientConfig.connectorProvider (new ApacheConnectorProvider ()); client = clientBuilder.newClient (clientConfig); } else {// Использовать ClientConfig в конструкторе для инициализации клиентского объекта client = clientBuilder.newClient (this.clientConfig); }} /** * Внимание: * Подробности: возвращает объект клиента. Если объект является нулевым, создайте клиента по умолчанию * @author chhliu */ @override public client getObject () throws exection {if (null == this.client) {return clientBuilder.newClient (); } вернуть this.client; } / ** * Внимание: * Подробности: Получить тип объекта клиента * @author chhliu * / @override public class <?> getObjectType () {return (this.client == null? client.class: this.client.getClass ()); } / ** * Внимание: * Подробности: является ли клиент -объект синглтоном, по умолчанию в Singleton * @author chhliu * / @override public boolean issingleton () {return true; }}Запрашивая инкапсуляцию Spring Boot Service:
@Component ("JerseyClient") открытый класс JerseyClient {@Resource (name = "JerseyPoolingClient") частного клиента; /** * Внимание: * Подробности: Запрос объекта через ID * @author chhliu */public resultmsg <githubentity> getResponseBonsyId (окончательный идентификатор строки). Vocation.builder vocationbuilder = webtarget.request (mediaType.application_json); GenericType <resultMsg <githubEntity >> genericType = new GenericType <resultMsg <githubEntity >> () {}; Ответ ответа = vocationbuilder.get (); if (response.getStatus () == 200) { /** Когда вызывается метод чтения, программа автоматически выпустит соединение*, даже если метод чтения не вызван, а объект генерического типа возвращается непосредственно, базовый уровень все равно будет выпускать соединение* / return response.readtentity (genericType); } else {resultMsg <githubentity> res = new ResultMsg <githubentity> (); res.setErrorCode (string.valueof (response.getStatus ())); res.seterrormsg (response.getStatusInfo (). toString ()); res.setok (false); вернуть Res; }} / ** * Внимание: * Подробности: запрос на страницу * @author chhliu * / public resultmsg <pager <githubentity >> getgithubwithpager (окончательный целый integer pageoffset, final integer pagesize, final String ordercolumn) {webtarget webtarget = client.target ("http: // localhost: 8080") .path ("/github/get/users/page") .queryparam ("pageoffset", pageoffset) .queryparam ("pagesize", PageSize) .queryparam ("ordercolumn", ordercolumn); // Обратите внимание, что если тип носителя здесь является mediaType.application_json, то соответствующим параметрам в службе должен быть предшествует @Requestbody vlocation.builder vlocationbuilder = webtarget.request (mediaType.application_json); GenericType <resultMsg <pager <GithubEntity >>>> GenericType = new GenericType <resultMsg <pager <GithubEntity >>> () {}; Ответ ответа = vocationbuilder.get (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultMsg <pager <GithubEntity >> res = new ResultMsg <pager <githubEntity >> (); res.setErrorCode (string.valueof (response.getStatus ())); res.seterrormsg (response.getStatusInfo (). toString ()); res.setok (false); вернуть Res; }} / ** * Внимание: * Подробная информация: запрос на основе имени пользователя * @author chhliu * / public resultmsg <list <githubentity >> getResponsebyusername (final String usernam client.target ("http: // localhost: 8080") .path ("/github/get/users/"+имя пользователя); Vocation.builder vocationbuilder = webtarget.request (mediaType.application_json); GenericType <resultMsg <list <GithubEntity >>> genericType = new GenericType <resultMsg <list <githubentity >>> () {}; Ответ ответа = vocationbuilder.get (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultMsg <list <GithubEntity >>> res = new ResultMsg <list <GithubEntity >> (); res.setErrorCode (string.valueof (response.getStatus ())); res.seterrormsg (response.getStatusInfo (). toString ()); res.setok (false); вернуть Res; }}/** * Внимание: * Подробности: Удалить запись на основе ID * @author chhliu */public resultmsg <githubentity> deleteById (окончательный идентификатор строки) Throws jsonProcessingException, ioException {webTarget target = client.target ("http: // localhost: 8080") .path ("/gits/git (" http: // localhost: 8080 "). GenericType <resultMsg <githubEntity >> genericType = new GenericType <resultMsg <githubEntity >> () {}; Ответ ответа = target.request (). Delete (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultMsg <githubentity> res = new ResultMsg <githubentity> (); res.setErrorCode (string.valueof (response.getStatus ())); res.seterrormsg (response.getStatusInfo (). toString ()); res.setok (false); вернуть Res; }}/** * Внимание: * Подробности: Обновление записи * @author chhliu */public rovestmsg <githubentity> обновление (конечная githubestity entity) Throws jsonprocessingException, ioException {webTarget target = client.target ("http: // localhost: 8080"). GenericType <resultMsg <githubEntity >> genericType = new GenericType <resultMsg <githubEntity >> () {}; Ответ ответа = target.request (). Buildput (entity.entity (entity, mediaType.application_json)). Invoke (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultMsg <githubentity> res = new ResultMsg <githubentity> (); res.setErrorCode (string.valueof (response.getStatus ())); res.seterrormsg (response.getStatusInfo (). toString ()); res.setok (false); вернуть Res; }}/** * Внимание: * Подробности: вставьте запись * @author chhliu */public resultmsg <githubentity> Сохранить (конечная githubestity entity) throws jsonprocessingexception, ioexception {webtarget target = client.target ("http: // localhost: 8080"). GenericType <resultMsg <githubEntity >> genericType = new GenericType <resultMsg <githubEntity >> () {}; Ответ ответа = target.request (). Buildpost (entity.entity (entity, mediaType.application_json)). Invoke (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultMsg <githubentity> res = new ResultMsg <githubentity> (); res.setErrorCode (string.valueof (response.getStatus ())); res.seterrormsg (response.getStatusInfo (). toString ()); res.setok (false); вернуть Res; }}} Подробное объяснение интерфейса клиента Джерси
1 клиентский интерфейс
Создание экземпляра клиента построено через ClientBuilder. Обычно экземпляр ClientConfig используется в качестве параметра. Если мы используем Client Client = ClientBuilder.newClient () для создания экземпляра клиента, мы каждый раз создадим экземпляр клиента, но экземпляр - тяжелый объект. Поэтому рекомендуется использовать http -соединение для управления соединениями, а не создавать клиент -объект каждый раз, когда мы просим. Для конкретных методов управления пулом соединений см. Пример кода выше.
2 Интерфейс WebTarget
Интерфейс WebTarget - это интерфейс, который реализует позиционирование ресурсов для клиентов REST. Через интерфейс WebTarget мы можем определить конкретный адрес запрошенного ресурса, параметров запроса и информации о типе носителя и т. Д. Мы можем завершить конфигурацию экземпляра WebTarget через цепочку методов, но следует отметить, что, хотя метод использования WebTarget очень похож на цепочку метода StringBuffer, он, по сути, отличается. Цепочка методов WebTarget должна установить возвращаемое значение метода в качестве ручки для последующего процесса. Что это значит? Смотрите следующие примеры:
Пример 1: пример метода метода StringBuffer
StringBuffer SB = new StringBuffer ("LCH"); SB.Append ("Hello"); SB.Append ("World"); SB.Append ("Hello"). Append ("World"); // Этот метод совпадает с двумя вышеуказанными строками кода.Пример 2: Пример цепочки методов WebTarget
// Использование цепочки метода одностроения кода для создания WebTarget webtarget webtarget = client.target ("http: // localhost: 8080"); webtarget.path ("/github/get/users/page") .queryparam ("pageoffset", pageoffset) .queryparam ("pagesize", pageize) .queryparam ("ordercolumn", ordercolumn); // Вот использование цепочек методов для создания webtarget webtarget.path ("/github/get/users/page"); webtarget.queryparam ("pageoffset", pageoffset); webtarget.queryparam ("pagesize", pagesize); // Результаты вышеупомянутых методов экземпляров очень разные. Приведенный выше метод экземпляра в порядке, проблем нет, но у следующего метода экземпляров есть проблемы. В следующем методе экземпляра каждая строка будет генерировать новый объект WebTarget. Оригинальная WebTarget не сыграла никакой роли. В конце концов, экземпляры каждого ряда разные. Если мы хотим создавать его в нескольких рядах, мы должны предоставить ручку для возврата каждого метода. Метод заключается в следующем: webtarget target = client.target ("http: // localhost: 8080"); Webtarget pathtarget = target.path ("/github/get/users/page"); Webtarget paramtarget = pathtarget.queryparam ("pageoffset", pageoffset); // При его использовании последнее время используйте последний объект экземпляра WebTarget 3 Интерфейс вызова
Интерфейс Invocation - это интерфейс, который инициирует запрос на сервер REST после завершения конфигурации позиционирования ресурса. Запрос включает в себя два метода: синхронизация и асинхронная. Он определяется интерфейсом Builder внутри интерфейса вызова. Интерфейс Builder наследует интерфейс синхронизации Syncinvoker. Примеры асинхронных вызовов следующие:
Future <resultMsg <list <GithubEntity >>> response = vlocationBuilder.async (). Get (genericType); if (response.isdone ()) {return response.get (); } Экземпляр интерфейса Invocation.Builder выполняет запросы GET и публикует запросы для отправки запросов и создает соответственно. По умолчанию тип возврата метода HTTP - тип ответа типа, а также поддерживает возвращаемое значение общего типа. В приведенном выше примере мы использовали большое количество дженериков, поэтому мы не будем слишком много объяснять здесь.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.