существуетSpringBootпроект напрямуюokhttp,httpClientилиRestTemplateположить началоHTTPЗапросы громоздки и неудобны для единого управления. Поэтому здесь рекомендуется использовать подходящийSpringBootОблегченная клиентская среда HTTP для проектовretrofit-spring-boot-starter, очень прост и удобен в использовании и в то же время предоставляет множество функциональных улучшений. Текущий проект обновлен до2.2.2версия, и будет продолжать итеративно оптимизировать.
адрес проекта на гитхабе:GitHub.com/l Домашняя техника Яна…
Адрес проекта gitee:git-ee.com/cheek-специальность…
предисловие
Retrofitприменимо кAndroidиJavaИ типобезопасный HTTP-клиент, его самая большая особенностьподдержка через接口способ инициировать HTTP-запрос. иspring-bootявляется наиболее широко используемой средой разработки Java, ноRetrofitОфициальной поддержки нетspring-bootФреймворки быстро интегрируются, поэтому мы разработалиretrofit-spring-boot-starter.
retrofit-spring-boot-starterДостигнутоRetrofitиspring-bootФреймворк быстро интегрируется и поддерживает множество функциональных расширений, что значительно упрощает разработку.
🚀Проект продолжает оптимизироваться и дорабатываться, приветствую всех, кто упоминает ISSUE и PR! Пожалуйста, дайте мне звезду✨, ваша звезда - движущая сила нашего постоянного обновления!
Функции
- Пользовательская инъекция OkHttpClient
- Аннотированные перехватчики
- Управление пулом соединений
- печать журнала
- запросить повторную попытку
- декодер ошибок
- глобальный перехватчик
- Слияние понижения
- HTTP-вызовы между микросервисами
- адаптер вызова
- Конвертер данных
быстрый в использовании
импортировать зависимости
<dependency>
<groupId>com.github.lianjiatech</groupId>
<artifactId>retrofit-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
определить http-интерфейс
должен использоваться интерфейс@RetrofitClientТег аннотации! Для получения информации, связанной с http, обратитесь к официальной документации:Официальная документация по обновлению.
@RetrofitClient(baseUrl = "${test.baseUrl}")
public interface HttpApi {
@GET("person")
Result<Person> getPerson(@Query("id") Long id);
}
вводить с помощью
Внедряйте интерфейс в другие сервисы и можно им пользоваться!
@Service
public class TestService {
@Autowired
private HttpApi httpApi;
public void test() {
// 通过httpApi发起http请求
}
}
Примечания к HTTP-запросам
HTTPЗапрос соответствующих комментариев, все использованоretrofitРодные аннотации.Подробности смотрите в официальной документации:Официальная документация по обновлению, ниже приводится краткое описание.
| Классификация аннотаций | Поддерживаемые аннотации |
|---|---|
| метод запроса |
@GET @HEAD @POST @PUT @DELETE @OPTIONS
|
| заголовок запроса |
@Header @HeaderMap @Headers
|
| Параметр запроса |
@Query @QueryMap @QueryName
|
| параметр пути | @Path |
| закодированные в форме параметры |
@Field @FieldMap @FormUrlEncoded
|
| Файл загружен |
@Multipart @Part @PartMap
|
| параметр URL | @Url |
Описание элемента конфигурации
retrofit-spring-boot-starterПоддерживается несколько настраиваемых свойств для работы с различными бизнес-сценариями. Вы можете изменить его в зависимости от ситуации, конкретные инструкции заключаются в следующем:
| настроить | По умолчанию | инструкция |
|---|---|---|
| enable-log | true | Включить печать журнала |
| logging-interceptor | DefaultLoggingInterceptor | Перехватчик печати журнала |
| pool | Конфигурация пула соединений | |
| disable-void-return-type | false | Отключить возвращаемый тип java.lang.Void |
| retry-interceptor | DefaultRetryInterceptor | перехватчик повторных попыток запроса |
| global-converter-factories | JacksonConverterFactory | глобальный завод преобразователей |
| global-call-adapter-factories | BodyCallAdapterFactory,ResponseCallAdapterFactory | Глобальный вызов фабрики адаптеров |
| enable-degrade | false | Включить ли переход на более раннюю версию автоматического выключателя |
| degrade-type | sentinel | Реализация перехода на более раннюю версию (в настоящее время поддерживает только Sentinel) |
| resource-name-parser | DefaultResourceNameParser | преобразователь имен ресурсов автоматического выключателя для разбора имен ресурсов |
ymlМетод конфигурации:
retrofit:
enable-response-call-adapter: true
# 启用日志打印
enable-log: true
# 连接池配置
pool:
test1:
max-idle-connections: 3
keep-alive-second: 100
test2:
max-idle-connections: 5
keep-alive-second: 50
# 禁用void返回值类型
disable-void-return-type: false
# 日志打印拦截器
logging-interceptor: com.github.lianjiatech.retrofit.spring.boot.interceptor.DefaultLoggingInterceptor
# 请求重试拦截器
retry-interceptor: com.github.lianjiatech.retrofit.spring.boot.retry.DefaultRetryInterceptor
# 全局转换器工厂
global-converter-factories:
- retrofit2.converter.jackson.JacksonConverterFactory
# 全局调用适配器工厂
global-call-adapter-factories:
- com.github.lianjiatech.retrofit.spring.boot.core.BodyCallAdapterFactory
- com.github.lianjiatech.retrofit.spring.boot.core.ResponseCallAdapterFactory
# 是否启用熔断降级
enable-degrade: true
# 熔断降级实现方式
degrade-type: sentinel
# 熔断资源名称解析器
resource-name-parser: com.github.lianjiatech.retrofit.spring.boot.degrade.DefaultResourceNameParser
Расширенные возможности
Пользовательская инъекция OkHttpClient
Обычно, по@RetrofitClientСвойства аннотаций создаются динамическиOkHttpClientОбъекты могут удовлетворить большинство сценариев использования. Но в некоторых случаях пользователям может потребоваться настроитьOkHttpClientВ это время вы можете определить тип возвращаемого значения в интерфейсе.OkHttpClient.BuilderСтатический метод для реализации. Пример кода выглядит следующим образом:
@RetrofitClient(baseUrl = "http://ke.com")
public interface HttpApi3 {
@OkHttpClientBuilder
static OkHttpClient.Builder okhttpClientBuilder() {
return new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.SECONDS)
.writeTimeout(1, TimeUnit.SECONDS);
}
@GET
Result<Person> getPerson(@Url String url, @Query("id") Long id);
}
необходимо использовать метод
@OkHttpClientBuilderАннотации!
Аннотированные перехватчики
Много раз мы хотим, чтобы некоторые http-запросы под определенным интерфейсом выполняли унифицированную логику обработки перехвата. Для поддержки этой функцииretrofit-spring-boot-starterпри условииАннотированные перехватчики,ВыполненоСопоставление перехвата на основе пути URL. Используемые шаги в основном делятся на 2 этапа:
- наследовать
BasePathMatchInterceptorНаписать обработчик перехвата; - используется в интерфейсе
@InterceptЭтикетка.如需配置多个拦截器,在接口上标注多个@InterceptПросто аннотируй!
Ниже сВставьте временную метку за указанным URL-адресом запроса.В качестве примера мы покажем, как использовать аннотированные перехватчики.
наследоватьBasePathMatchInterceptorНаписать обработчик перехвата
@Component
public class TimeStampInterceptor extends BasePathMatchInterceptor {
@Override
public Response doIntercept(Chain chain) throws IOException {
Request request = chain.request();
HttpUrl url = request.url();
long timestamp = System.currentTimeMillis();
HttpUrl newUrl = url.newBuilder()
.addQueryParameter("timestamp", String.valueOf(timestamp))
.build();
Request newRequest = request.newBuilder()
.url(newUrl)
.build();
return chain.proceed(newRequest);
}
}
используется в интерфейсе@Interceptметка
@RetrofitClient(baseUrl = "${test.baseUrl}")
@Intercept(handler = TimeStampInterceptor.class, include = {"/api/**"}, exclude = "/api/test/savePerson")
public interface HttpApi {
@GET("person")
Result<Person> getPerson(@Query("id") Long id);
@POST("savePerson")
Result<Person> savePerson(@Body Person person);
}
выше@InterceptПредставление конфигурации: InterceptHttpApiпод интерфейсом/api/**по пути (исключить/api/test/savePerson) запросы, обработчик перехвата используетTimeStampInterceptor.
Расширенный аннотированный перехватчик
Иногда нам нужноАннотация перехватаДинамически передавать некоторые параметры, а затем использовать этот параметр при выполнении перехвата. На данный момент мы можем расширить реализациюПользовательская аннотация перехвата.自定义拦截注解должен использовать@InterceptMarkотметка иПримечания должны включатьinclude()、exclude()、handler()атрибутивная информация. Используемые шаги в основном делятся на 3 этапа:
- Пользовательская аннотация перехвата
- наследовать
BasePathMatchInterceptorНаписать обработчик перехвата - Используйте пользовательские аннотации перехвата на интерфейсах;
Например, нам нужноДинамически добавить в заголовок запросаaccessKeyId,accessKeySecretИнформация о подписи может инициировать HTTP-запросы в обычном режиме.,В настоящее времяВы можете настроить подписанную аннотацию перехватчика@Signреализовать. Ниже для настройки@SignАннотация перехвата используется в качестве примера для иллюстрации.
настроить@Signаннотация
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@InterceptMark
public @interface Sign {
/**
* 密钥key
* 支持占位符形式配置。
*
* @return
*/
String accessKeyId();
/**
* 密钥
* 支持占位符形式配置。
*
* @return
*/
String accessKeySecret();
/**
* 拦截器匹配路径
*
* @return
*/
String[] include() default {"/**"};
/**
* 拦截器排除匹配,排除指定路径拦截
*
* @return
*/
String[] exclude() default {};
/**
* 处理该注解的拦截器类
* 优先从spring容器获取对应的Bean,如果获取不到,则使用反射创建一个!
*
* @return
*/
Class<? extends BasePathMatchInterceptor> handler() default SignInterceptor.class;
}
расширять自定义拦截注解Следует отметить два момента:
-
自定义拦截注解должен использовать@InterceptMarkотметка. - Примечания должны включать
include()、exclude()、handler()информация о собственности.
выполнитьSignInterceptor
@Component
public class SignInterceptor extends BasePathMatchInterceptor {
private String accessKeyId;
private String accessKeySecret;
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
@Override
public Response doIntercept(Chain chain) throws IOException {
Request request = chain.request();
Request newReq = request.newBuilder()
.addHeader("accessKeyId", accessKeyId)
.addHeader("accessKeySecret", accessKeySecret)
.build();
return chain.proceed(newReq);
}
}
вышесказанноеaccessKeyIdиaccessKeySecretЗначения полей будут основаны на@SignаннотированныйaccessKeyId()иaccessKeySecret()Значение автоматически вводится, если@SignЕсли указанная строка имеет форму заполнителя, значение свойства конфигурации будет взято для внедрения.. Кроме того,accessKeyIdиaccessKeySecretПоле должно быть предоставленоsetterметод.
используется в интерфейсе@Sign
@RetrofitClient(baseUrl = "${test.baseUrl}")
@Sign(accessKeyId = "${test.accessKeyId}", accessKeySecret = "${test.accessKeySecret}", exclude = {"/api/test/person"})
public interface HttpApi {
@GET("person")
Result<Person> getPerson(@Query("id") Long id);
@POST("savePerson")
Result<Person> savePerson(@Body Person person);
}
Таким образом, информация о подписи может быть автоматически добавлена к запросу указанного URL-адреса.
Управление пулом соединений
По умолчанию всеRetrofitОтправленный http-запрос будет использоватьmax-idle-connections=5 keep-alive-second=300Пул соединений по умолчанию для . Конечно, мы также можем настроить несколько пользовательских пулов соединений в файле конфигурации, а затем передать@RetrofitClientизpoolNameАтрибут указать. Например, мы делаем запрос вообще использовать интерфейсpoolName=test1Пул соединений, код реализован следующим образом:
-
Настройте пул соединений.
retrofit: # 连接池配置 pool: test1: max-idle-connections: 3 keep-alive-second: 100 test2: max-idle-connections: 5 keep-alive-second: 50 -
пройти через
@RetrofitClientизpoolNameсвойство, чтобы указать используемый пул соединений.@RetrofitClient(baseUrl = "${test.baseUrl}", poolName="test1") public interface HttpApi { @GET("person") Result<Person> getPerson(@Query("id") Long id); }
печать журнала
Во многих случаях мы хотим регистрировать http-запросы. пройти черезretrofit.enableLogКонфигурация может глобально управлять журналом, независимо от того, включен ли журнал.
Для каждого интерфейса можно передать@RetrofitClientизenableLogКонтролировать, открывать ли, черезlogLevelиlogStrategy, вы можете указать уровень печати журнала и политику печати журнала для каждого интерфейса.retrofit-spring-boot-starterПоддерживается 5 уровней печати журнала (ERROR, WARN, INFO, DEBUG, TRACE),дефолтINFO; поддерживает 4 стратегии печати журнала (NONE, BASIC, HEADERS, BODY),дефолтBASIC. Значения четырех стратегий печати журнала следующие:
-
NONE: Нет логов. -
BASIC: Регистрирует строки запроса и ответа. -
HEADERS: регистрирует строки запросов и ответов и их соответствующие заголовки. -
BODY: регистрирует строки запросов и ответов, а также их соответствующие заголовки и тела (если они есть).
retrofit-spring-boot-starterиспользуется по умолчаниюDefaultLoggingInterceptorВыполните настоящую функцию печати журнала, нижний слойokhttpоригинальныйHttpLoggingInterceptor. Конечно, вы также можете настроить и реализовать свой собственный перехватчик печати журнала, просто унаследовавBaseLoggingInterceptor(Подробнее см.DefaultLoggingInterceptorреализации), а затем настроить его в файле конфигурации.
retrofit:
# 日志打印拦截器
logging-interceptor: com.github.lianjiatech.retrofit.spring.boot.interceptor.DefaultLoggingInterceptor
запросить повторную попытку
retrofit-spring-boot-starterПоддержка функции повтора запроса, нужно только добавить интерфейс или метод@RetryПросто аннотируйте.@RetryПоддержка повторных попытокmaxRetries, интервал повтораintervalMsи повторить правилаretryRulesнастроить. Правило повтора поддерживает три конфигурации:
-
RESPONSE_STATUS_NOT_2XX: Код состояния ответа не2xxПри повторной попытке; -
OCCUR_IO_EXCEPTION: выполнить повторную попытку при возникновении исключения ввода-вывода; -
OCCUR_EXCEPTION: повторная попытка выполняется при возникновении любого исключения;
Код состояния ответа по умолчанию не2xxИли автоматически повторить попытку при возникновении исключения ввода-вывода. Вы также можете наследовать, если это необходимоBaseRetryInterceptorРеализуйте свой собственный перехватчик повторных попыток запроса и настройте его.
retrofit:
# 请求重试拦截器
retry-interceptor: com.github.lianjiatech.retrofit.spring.boot.retry.DefaultRetryInterceptor
декодер ошибок
существуетHTTPКогда возникает ошибка запроса (включая исключение или данные ответа не соответствуют ожиданиям), декодер ошибок можетHTTPСоответствующая информация декодируется в пользовательское исключение. ты сможешь@RetrofitClientаннотированныйerrorDecoder()Указывает декодер ошибок текущего интерфейса, необходимо реализовать пользовательские декодеры ошибокErrorDecoderинтерфейс:
/**
* 错误解码器。ErrorDecoder.
* 当请求发生异常或者收到无效响应结果的时候,将HTTP相关信息解码到异常中,无效响应由业务自己判断
*
* When an exception occurs in the request or an invalid response result is received, the HTTP related information is decoded into the exception,
* and the invalid response is determined by the business itself.
*
* @author 陈添明
*/
public interface ErrorDecoder {
/**
* 当无效响应的时候,将HTTP信息解码到异常中,无效响应由业务自行判断。
* When the response is invalid, decode the HTTP information into the exception, invalid response is determined by business.
*
* @param request request
* @param response response
* @return If it returns null, the processing is ignored and the processing continues with the original response.
*/
default RuntimeException invalidRespDecode(Request request, Response response) {
if (!response.isSuccessful()) {
throw RetrofitException.errorStatus(request, response);
}
return null;
}
/**
* 当请求发生IO异常时,将HTTP信息解码到异常中。
* When an IO exception occurs in the request, the HTTP information is decoded into the exception.
*
* @param request request
* @param cause IOException
* @return RuntimeException
*/
default RuntimeException ioExceptionDecode(Request request, IOException cause) {
return RetrofitException.errorExecuting(request, cause);
}
/**
* 当请求发生除IO异常之外的其它异常时,将HTTP信息解码到异常中。
* When the request has an exception other than the IO exception, the HTTP information is decoded into the exception.
*
* @param request request
* @param cause Exception
* @return RuntimeException
*/
default RuntimeException exceptionDecode(Request request, Exception cause) {
return RetrofitException.errorUnknown(request, cause);
}
}
глобальный перехватчик
Глобальный перехватчик приложений
Если нам нужно выполнить унифицированную обработку перехвата HTTP-запросов для всей системы, вы можете настроить глобальный перехватчикBaseGlobalInterceptor, и настроен какspringв контейнереbean! Например, нам нужно вывести исходную информацию на http-запросы, инициированные по всей системе.
@Component
public class SourceInterceptor extends BaseGlobalInterceptor {
@Override
public Response doIntercept(Chain chain) throws IOException {
Request request = chain.request();
Request newReq = request.newBuilder()
.addHeader("source", "test")
.build();
return chain.proceed(newReq);
}
}
Перехватчик глобальной сети
просто нужно реализоватьNetworkInterceptorинтерфейс и настроить его какspringв контейнереbeanОн поддерживает автоматическое сплетение перехватчиков глобальной сети.
Слияние понижения
В распределенной сервисной архитектуре объединение и понижение версии нестабильных внешних сервисов является одной из важных мер по обеспечению высокой доступности сервисов. Поскольку стабильность внешней службы не может быть гарантирована, когда внешняя служба нестабильна, время отклика будет больше. Соответственно, время ответа вызывающей стороны также увеличится, потоки будут накапливаться, и в конечном итоге пул потоков вызывающей стороны может быть исчерпан, что сделает всю службу недоступной. Следовательно, нам необходимо объединять и понижать уровень нестабильных слабозависимых сервисных вызовов, временно отключать нестабильные вызовы и избегать локальной нестабильности, ведущей к общим лавинам сервисов.
retrofit-spring-boot-starterПоддержка функции понижения предохранителя, нижний слой основан наSentinelвыполнить. В частности, он поддерживаетОбъединение самообнаружения ресурсовиАннотированная конфигурация правила перехода на более раннюю версию. Чтобы использовать переход на более раннюю версию автоматического выключателя, просто выполните следующие действия:
1. Включите функцию понижения предохранителя.
По умолчанию функция перехода на более раннюю версию отключена.Чтобы включить функцию пониженной версии предохранителя, необходимо установить соответствующий элемент конфигурации.:
retrofit:
# 是否启用熔断降级
enable-degrade: true
# 熔断降级实现方式(目前仅支持Sentinel)
degrade-type: sentinel
# 资源名称解析器
resource-name-parser: com.github.lianjiatech.retrofit.spring.boot.degrade.DefaultResourceNameParser
Преобразователь имен ресурсов используется для реализации определяемых пользователем имен ресурсов.Конфигурация по умолчанию:DefaultResourceNameParser, соответствующий формат имени ресурсаHTTP_OUT:GET:http://localhost:8080/api/degrade/test. Пользователи могут наследоватьBaseResourceNameParserКласс реализует собственный преобразователь имен ресурсов.
Кроме того, поскольку функция понижения рейтинга автоматического выключателя не является обязательной,Следовательно, включение перехода на более раннюю версию предохранителя требует, чтобы пользователи сами вводили зависимости Sentinel.:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.6.3</version>
</dependency>
2. Настройте правила отклонения (необязательно)
retrofit-spring-boot-starterПоддерживает аннотированные правила понижения конфигурации через@DegradeАннотация для настройки правил перехода на более раннюю версию.@DegradeАннотации можно настроить для интерфейсов или методов, а методы, настроенные для методов, имеют более высокий приоритет.
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
public @interface Degrade {
/**
* RT threshold or exception ratio threshold count.
*/
double count();
/**
* Degrade recover timeout (in seconds) when degradation occurs.
*/
int timeWindow() default 5;
/**
* Degrade strategy (0: average RT, 1: exception ratio).
*/
DegradeStrategy degradeStrategy() default DegradeStrategy.AVERAGE_RT;
}
Если проект приложения уже поддерживает настройку правил перехода на более раннюю версию через центр конфигурации, метод настройки аннотаций можно игнорировать..
3. @RetrofitClient установить резервный вариант или fallbackFactory (необязательно)
если@RetrofitClientНе настраиватьfallbackилиfallbackFactory, при срабатывании предохранителя он будет выброшен прямоRetrofitBlockExceptionаномальный.Пользователи могут установитьfallbackилиfallbackFactoryЧтобы настроить значение возврата метода при взорвании.fallbackКласс должен быть классом реализации текущего интерфейса,fallbackFactoryдолжно бытьFallbackFactory<T>Класс реализации, общий тип параметра — это текущий тип интерфейса. Кроме того,fallbackиfallbackFactoryЭкземпляр должен быть настроен какSpringконтейнерBean.
fallbackFactoryотносительноfallback, основное отличие состоит в том, что ненормальная причина каждого предохранителя может быть обнаружена (причина). Справочный пример выглядит следующим образом:
@Slf4j
@Service
public class HttpDegradeFallback implements HttpDegradeApi {
@Override
public Result<Integer> test() {
Result<Integer> fallback = new Result<>();
fallback.setCode(100)
.setMsg("fallback")
.setBody(1000000);
return fallback;
}
}
@Slf4j
@Service
public class HttpDegradeFallbackFactory implements FallbackFactory<HttpDegradeApi> {
/**
* Returns an instance of the fallback appropriate for the given cause
*
* @param cause fallback cause
* @return 实现了retrofit接口的实例。an instance that implements the retrofit interface.
*/
@Override
public HttpDegradeApi create(Throwable cause) {
log.error("触发熔断了! ", cause.getMessage(), cause);
return new HttpDegradeApi() {
@Override
public Result<Integer> test() {
Result<Integer> fallback = new Result<>();
fallback.setCode(100)
.setMsg("fallback")
.setBody(1000000);
return fallback;
}
}
}
HTTP-вызовы между микросервисами
Чтобы иметь возможность использовать вызовы микросервисов, требуется следующая конфигурация:
настроитьServiceInstanceChooserзаSpringконтейнерBean
Пользователи могут реализоватьServiceInstanceChooserинтерфейса, завершите логику выбора экземпляра службы и настройте его какSpringконтейнерBean. заSpring Cloudприменение,retrofit-spring-boot-starterпри условииSpringCloudServiceInstanceChooserРеализация, пользователь просто настроенSpringизBeanВот и все.
@Bean
@Autowired
public ServiceInstanceChooser serviceInstanceChooser(LoadBalancerClient loadBalancerClient) {
return new SpringCloudServiceInstanceChooser(loadBalancerClient);
}
использовать@RetrofitизserviceIdиpathАтрибуты, которые могут реализовывать HTTP-вызовы между микросервисами.
@RetrofitClient(serviceId = "${jy-helicarrier-api.serviceId}", path = "/m/count", errorDecoder = HelicarrierErrorDecoder.class)
@Retry
public interface ApiCountService {
}
Вызов адаптеров и транскодеров данных
адаптер вызова
RetrofitАдаптер может быть вызванCallAdapterFactoryбудетCall<T>Объект адаптирован к возвращаемому типу метода интерфейса.retrofit-spring-boot-starterРазвернуть 2 видаCallAdapterFactoryвыполнить:
-
BodyCallAdapterFactory- Включен по умолчанию и может быть настроен
retrofit.enable-body-call-adapter=falseзакрытие - Выполните HTTP-запрос синхронно и адаптируйте содержимое тела ответа к экземпляру типа возвращаемого значения метода интерфейса.
- Кроме
Retrofit.Call<T>,Retrofit.Response<T>,java.util.concurrent.CompletableFuture<T>Кроме того, этот адаптер могут использовать другие типы возврата.
- Включен по умолчанию и может быть настроен
-
ResponseCallAdapterFactory- Включено по умолчанию и может быть настроено
retrofit.enable-response-call-adapter=falseзакрытие - Синхронно выполните HTTP-запрос и адаптируйте содержимое тела ответа к
Retrofit.Response<T>возвращение. - Если возвращаемый тип метода
Retrofit.Response<T>, вы можете использовать адаптер.
- Включено по умолчанию и может быть настроено
Retrofit автоматически выбирает соответствующий метод на основе типа возвращаемого значения метода.CallAdapterFactoryВыполните процесс адаптации! Плюс дооснащение по умолчаниюCallAdapterFactoryПоддержка нескольких форм типов возвращаемого значения методов:
-
Call<T>: Возврат напрямую без выполнения обработки адаптацииCall<T>объект -
CompletableFuture<T>: адаптировать содержимое тела ответа кCompletableFuture<T>возврат объекта -
Void: не обращайте внимания на возвращаемый тип, можно использоватьVoid. Если код состояния http не равен 2xx, выдайте ошибку напрямую! -
Response<T>: адаптировать содержимое ответа кResponse<T>возврат объекта - Любой другой тип Java: адаптируйте содержимое тела ответа к соответствующему объекту типа Java и верните его.Если код состояния http не 2xx, выдайте ошибку напрямую!
/**
* Call<T>
* 不执行适配处理,直接返回Call<T>对象
* @param id
* @return
*/
@GET("person")
Call<Result<Person>> getPersonCall(@Query("id") Long id);
/**
* CompletableFuture<T>
* 将响应体内容适配成CompletableFuture<T>对象返回
* @param id
* @return
*/
@GET("person")
CompletableFuture<Result<Person>> getPersonCompletableFuture(@Query("id") Long id);
/**
* Void
* 不关注返回类型可以使用Void。如果http状态码不是2xx,直接抛错!
* @param id
* @return
*/
@GET("person")
Void getPersonVoid(@Query("id") Long id);
/**
* Response<T>
* 将响应内容适配成Response<T>对象返回
* @param id
* @return
*/
@GET("person")
Response<Result<Person>> getPersonResponse(@Query("id") Long id);
/**
* 其他任意Java类型
* 将响应体内容适配成一个对应的Java类型对象返回,如果http状态码不是2xx,直接抛错!
* @param id
* @return
*/
@GET("person")
Result<Person> getPerson(@Query("id") Long id);
Мы также можем наследоватьCallAdapter.FactoryРасширьте свои собственныеCallAdapter!
retrofit-spring-boot-starterподдержка черезretrofit.global-call-adapter-factoriesНастройте глобальный завод адаптера вызовов. Заводской экземпляр преимущественно получен из весеннего контейнера. Если он не получен, он будет создан путем отражения. Фабрика адаптера глобального вызова по умолчанию[BodyCallAdapterFactory, ResponseCallAdapterFactory]!
retrofit:
# 全局调用适配器工厂
global-call-adapter-factories:
- com.github.lianjiatech.retrofit.spring.boot.core.BodyCallAdapterFactory
- com.github.lianjiatech.retrofit.spring.boot.core.ResponseCallAdapterFactory
Для каждого интерфейса Java вы также можете передать@RetrofitClientаннотированныйcallAdapterFactories()Указывает текущий интерфейс для использованияCallAdapter.Factory, указанный экземпляр фабрики по-прежнему преимущественно получается из контейнера Spring.
Примечание: еслиCallAdapter.Factoryнетpublicконструктор без аргументов, вручную настройте его какSpringконтейнерBeanобъект!
транскодер данных
RetrofitиспользоватьConverterбудет@BodyАннотированный объект преобразуется в тело запроса, а данные тела ответа преобразуются вJavaобъект, вы можете выбрать один из следующихConverter:
- Gson: com.squareup.Retrofit:converter-gson
- Jackson: com.squareup.Retrofit:converter-jackson
- Moshi: com.squareup.Retrofit:converter-moshi
- Protobuf: com.squareup.Retrofit:converter-protobuf
- Wire: com.squareup.Retrofit:converter-wire
- Simple XML: com.squareup.Retrofit:converter-simplexml
- JAXB: com.squareup.retrofit2:converter-jaxb
retrofit-spring-boot-starterподдержка черезretrofit.global-converter-factoriesНастройте глобальную фабрику преобразователей данных. Экземпляр фабрики преобразователей предпочтительно получается из контейнера Spring. Если он не получен, он будет создан путем отражения. Фабрика преобразования глобальных данных по умолчанию:retrofit2.converter.jackson.JacksonConverterFactory, вы можете напрямую пройтиspring.jackson.*настроитьjacksonПравила сериализации, конфигурация может относиться кCustomize the Jackson ObjectMapper!
retrofit:
# 全局转换器工厂
global-converter-factories:
- retrofit2.converter.jackson.JacksonConverterFactory
Для каждого интерфейса Java вы также можете передать@RetrofitClientаннотированныйconverterFactories()Указывает текущий интерфейс для использованияConverter.Factory, указанный экземпляр фабрики конвертеров по-прежнему преимущественно получается из контейнера Spring.
Примечание: еслиConverter.Factoryнетpublicконструктор без аргументов, вручную настройте его какSpringконтейнерBeanобъект!
Суммировать
retrofit-spring-boot-starterодин относится кSpringBootЛегкий проектHTTPПлатформа на стороне клиента стабильно работает в сети уже более года, и к ней обращаются многие внешние компании. Заинтересованные друзья могут попробовать. Если у вас есть какие-либо вопросы, отправьте сообщение о проблеме или оставьте отзыв в группе QQ (806714302) и быстро ответьте в службу поддержки.
Нелегко быть оригинальным. Если вы считаете, что статья написана хорошо, пожалуйста, поставьте лайк 👍 и поддержите ее~
Добро пожаловать в мой проект с открытым исходным кодом:Облегченная среда вызовов HTTP для SpringBoot