easy-http
easy-http — это полностью основанный на аннотациях и интерфейсах HTTP-клиент, созданный для упрощения разработки и повышения эффективности.
Java версии: минимум 8
<dependency>
<groupId>com.github.vizaizai</groupId>
<artifactId>easy-http</artifactId>
<version>4.1.8</version>
</dependency>
Версия spring-boot доступна по адресу: easy-http-boot-starter
Сначала определите интерфейс:
public interface BookHttpService {
@Get("/books/{id}")
ApiResult<Book> getBookById(@Var("id") String id);
}
Это самый простой пример интерфейса запроса. Затем создайте и выполните его через интерфейс:
BookHttpService bookHttpService = EasyHttp.builder()
.url("127.0.0.1:8888")
.build(BookHttpService.class);
ApiResult<Book> bookRet = bookHttpService.getBookById("166895");
System.out.println(bookRet.getData().getName());
Подобные аннотации для методов запроса включают @Post, @Put и @Delete.
@var
Аннотации переменных пути используются для замены переменных в пути, и переменные пути должны быть базовыми типами параметров.
@Get("/books/{id}")
ApiResult<Book> getBookById(@Var("id") String id);
@Get("/books?author={author}")
ApiResult<Book> getBookById(@Var("author") String author);
@Param
Параметры, отмеченные этой аннотацией, могут быть базовыми типами, массивами, списками, Map и JavaBean. Обратите внимание:
-parameters
, то ключ будет взят из имени поля, в противном случае это будет arg1~n.x-www-form-urlencoded
(форма).@Get("/books")
ApiResult<List<Book>> listBooksByAuthor1(@Param("author") String author);
// Установлен параметр -parameters
@Get("/books")
ApiResult<List<Book>> listBooksByAuthor2(@Param String author);
@Get("/books")
ApiResult<List<Book>> listBooksByAuthor(@Param Map<String, String> params);
@Get("/books")
ApiResult<List<Book>> listBooksByAuthor(Map<String, String> params);
@Get("/books")
ApiResult<List<Book>> listBooksByIds(@Param("ids") List<String> ids);
@Post("/addBookUseForm")
String test5(@Param Book book); // Тело запроса x-www-form-urlencoded
@POST(value="/addBookUseForm", bodyType = RequestBodyType.NONE) // Указывает отсутствие тела запроса, параметры добавляются к URL
String test5_1(@Param Book book); // Склейка URL, например /addBookUseForm?name=easyhttp&author=lcw
@Body
Содержит содержимое тела запроса.
@Post("/books")
void addBook(@Body Book book);
@Post("/addBookUseJSON")
String test6(@Body Book1 book1);
@Post("/addBookUseJSON")
String test6_1(@Body Map<String,Object> book);
@Post("/addBookUseJSON")
String test6_2(@Body String content);
@Post("/addBookUseFormData")
String test8(@Body FormData formData);
// Использование form-data
FormData formData = new FormData();
formData.addText("author","吴承恩");
formData.addText("name","西游记");
formData.addText("lang","chinese");
formData.addFile("files", new File("C:\\Users\\dell\\Desktop\\logo.png"));
formData.addFile("files", new File("C:\\Users\\dell\\Desktop\\Dingtalk_20210317145859.jpg"));
formData.addFile("files", new File("C:\\Users\\dell\\Desktop\\jsd_pro_back.rar"));
paramService.test8(formData);
@Post("/upload/e-book/{id}")
String test9(@Var String id, @Body BodyContent bodyContent);
// Двоичный файл
paramService.test9("123", FileContent.of(new File("C:\\Users\\dell\\Desktop\\jsd_pro_back.rar")));
@Headers
Аннотация заголовка запроса, которая может использоваться для интерфейсов, методов и параметров методов. Для интерфейсов и методов необходимо указать значение, формат: key: value 5. Пользовательский кодировщик
Кодировщик: преобразует параметры объекта в соответствующие HTTP-запросы.
Необходимо написать класс CustomEncoder
, который реализует интерфейс Encoder
.
public class CustomEncoder implements Encoder {
/**
* Преобразует объект в Body (если тип параметра является базовым типом, то он напрямую преобразуется в строку). Используется для кодирования объекта с аннотацией @Body (по умолчанию используется кодирование jackson).
* @param object Объект для кодирования
* @param bodyType Тип объекта запроса
* @return Body
*/
@Override
public Body encode(Object object, Type bodyType) {
return null;
}
}
В процессе создания объекта необходимо добавить CustomEncoder
:
BookHttpService bookHttpService = EasyHttp.builder()
.url("127.0.0.1:8888")
.encoder(new CustomEncoder())
.build(BookHttpService.class);
6. Пользовательский декодер
Декодирует возвращаемое тело в объект.
Нужно написать класс CustomDecoder
, который реализует интерфейс Decoder
.
public class CustomDecoder implements Decoder {
/**
* Расшифровывает ответ (декодирование по умолчанию реализовано с помощью jackson).
* @param response Ответ
* @param type Тип возвращаемого значения
* @return Object
*/
@Override
public Object decode(HttpResponse response, Type type) {
return null;
}
}
При создании объекта необходимо добавить CustomDecoder
:
BookHttpService bookHttpService = EasyHttp.builder()
.url("127.0.0.1:8888")
.encoder(new CustomEncoder())
.decoder(new CustomDecoder())
.build(BookHttpService.class);
7. Пользовательский перехватчик
Перехватывает запросы перед отправкой и после получения ответа.
Следует написать класс ResultInterceptor
, который реализует интерфейс HttpInterceptor
. В этом классе можно выделить данные из ответа и вернуть их.
public class ResultInterceptor implements HttpInterceptor {
@Override
public boolean preHandle(HttpRequest request) {
return true;
}
@Override
public void postHandle(HttpRequest request, HttpResponse response) {
if (!response.isOk()) {
throw new EasyHttpException("Запрос ошибочен~");
}
if (response.getBody() == null) {
return;
}
try {
JavaType javaType = mapper.getTypeFactory().constructParametricType(ApiResult.class,
mapper.getTypeFactory().constructType(response.getReturnType()));
ApiResult<Object> bizRet = mapper.readValue(response.getBody().asInputStream(), javaType);
// 200 — успешное выполнение операции
if (bizRet.getCode() == 200) {
if (bizRet.getData() != null) {
// Данные используются как возвращаемое значение
response.setReturnObject(bizRet.getData());
return;
}
}
response.setReturnObject(null);
}catch (Exception e) {
throw new EasyHttpException(e);
}
}
@Override
public int order() {
return 4;
}
@Override
public List<ExcludePath> excludes() {
return Arrays.asList(ExcludePath.instance("/books/**", HttpMethod.DELETE, HttpMethod.POST));
}
}
preHandle
— перехват запроса перед отправкой, если возвращается true
, запрос отправляется, иначе — блокируется. postHandle
— перехват ответа после получения. order
определяет порядок перехватчиков, чем меньше значение, тем раньше выполняется перехват. excludes
определяет список путей, для которых перехватчик не используется. Здесь ResultInterceptor
обрабатывает унифицированный ответ. Он не только проверяет успешность запроса и операции, но также упаковывает ответ, удаляя ненужную информацию.
Для создания объекта нужно добавить перехватчики в список:
BookHttpService bookHttpService = EasyHttp.builder()
.url("127.0.0.1:8888")
.encoder(new CustomEncoder())
.decoder(new CustomDecoder())
.withInterceptor(new ResultInterceptor())
.withInterceptor(new TimeInterceptor())
.build(BookHttpService.class);
8. Смена клиента
EasyHttp.builder()
.url("127.0.0.1:8888")
.client(ApacheHttpClient.getInstance())
.build(BookHttpService.class);
9. Асинхронный запрос 1. Использование Future или CompletableFuture для реализации асинхронности
Можно легко реализовать асинхронность, если сделать возвращаемый параметр метода Future или CompletableFuture.
// Интерфейс метода
@Get("/books")
CompletableFuture<ApiResult<List<Book>>> foo();
// Выполнение асинхронного запроса
CompletableFuture<ApiResult<List<Book>>> foo = bookHttpService.foo();
foo.thenAccept(e->System.out.println(e.getData()))
.thenRun(()->System.out.println("Асинхронный запрос выполнен"));
System.out.println("Асинхронно");
foo.join();
Для получения дополнительной информации о Java8 CompletableFuture перейдите по ссылке Java8 CompletableFuture.
2. Повторные попытки
Повторные попытки можно включить глобально или настроить для каждого запроса с помощью аннотации.
Правила запуска: по умолчанию правила запускаются, когда метод запроса — GET и код состояния HTTP равен 5XX, либо при тайм-ауте соединения. Также поддерживается пользовательское правило запуска retryable(Integer retries, Integer interval, RetryTrigger retryTrigger), которое реализуется путём передачи интерфейса RetryTrigger.
EasyHttp.builder()
.url("127.0.0.1:8888")
.client(DefaultURLClient.getInstance())
.retryable(3,1000,new DefaultRule())
.build(BookHttpService.class);
3. Загрузка файлов
easyHttp поддерживает возврат HttpResponse напрямую, что позволяет получить доступ к байтовому потоку ответа и заголовкам ответа.
Если у вас есть хорошие предложения или вопросы, вы можете связаться со мной:
— QQ: 274550900; — Email: liaochongwei666@163.com.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )