1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lcwpro-easy-http

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

easy-http

Быстрый старт

easy-http — это полностью основанный на аннотациях и интерфейсах HTTP-клиент, созданный для упрощения разработки и повышения эффективности.

1. Характеристики

  • Простота аннотаций: аннотации следуют общепринятым соглашениям об именах, таким как @Body, @Param, @Var и т. д.
  • Отсутствие вмешательства: интерфейсы не требуют наследования.
  • Поддержка различных типов тел запросов: x-www-form-urlencoded, form-data (включая файлы), binary (двоичные данные), raw (текстовые данные в формате JSON или XML).
  • Реализация для нескольких клиентов: поддержка различных клиентских библиотек на нижнем уровне, включая Java Native URL и HttpClient, с возможностью настройки клиента.
  • Асинхронные запросы.
  • Пользовательские кодировщики и декодировщики: по умолчанию встроен универсальный кодировщик/декодировщик JSON (с поддержкой универсальных типов для возвращаемых параметров), но можно настроить поддержку XML.
  • Настраиваемые перехватчики: перехват до и после запроса. Перехватчики могут удовлетворить большинство бизнес-требований, таких как расчёт времени выполнения запроса, динамическое добавление общих заголовков запросов, унифицированная обработка ошибок и т.д.
  • Повторные попытки запросов с настраиваемыми правилами запуска.
  • Предлагается версия spring-boot для более простого использования.

2. Установка

Java версии: минимум 8

<dependency>
    <groupId>com.github.vizaizai</groupId>
    <artifactId>easy-http</artifactId>
    <version>4.1.8</version>
</dependency>

Версия spring-boot доступна по адресу: easy-http-boot-starter

3. Использование

Сначала определите интерфейс:

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.

4. Аннотации параметров метода

  • Основные типы данных: базовые типы данных, упакованные типы, void, Void, String, Number и реализации класса Number.

@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.
  • Когда параметр метода не имеет никаких аннотаций, он по умолчанию считается @Param.
  • При использовании метода GET параметры @Param будут использоваться в качестве параметров запроса (присоединены к URL), в противном случае они будут рассматриваться как 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

Содержит содержимое тела запроса.

  • Когда тип параметра, помеченного этой аннотацией, равен FormData, тело запроса будет multipart/form-data. FormData может добавлять текст и файлы.
  • Когда типом параметра, помеченным этой аннотацией, является реализация класса BodyContent, тело запроса представляет собой все двоичные файлы. BodyContent по умолчанию реализует FileContent, InputStreamContent и StringContent.
  • В противном случае параметр, помеченный этой аннотацией, будет обрабатываться кодировщиком и помещаться в тело запроса. Если тип параметра является базовым, он будет напрямую преобразован в символы и отправлен в тело запроса.
@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 )

Вы можете оставить комментарий после Вход в систему

Введение

easy-http: основанный на интерфейсах HTTP-клиент для запросов, созданный для упрощения разработки и повышения эффективности. Также предоставляется версия spring-boot-starter, которая автоматически сканируется и внедряется в IoC. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/lcwpro-easy-http.git
git@api.gitlife.ru:oschina-mirror/lcwpro-easy-http.git
oschina-mirror
lcwpro-easy-http
lcwpro-easy-http
master