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

OSCHINA-MIRROR/xxssyyyyssxx-unihttp-all

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 01:22 6772b36

Прекрасный клиент HTTP

Определение абстрактного интерфейса HttpClient и предоставление множества реализаций

Введение

Этот проект представляет собой интерфейсы, определяющие все реализации HTTP протокола для описания HTTP запроса. Использующие сторонние библиотеки могут работать с одним и тем же набором семантических интерфейсов; при необходимости замены одной реализации HTTP на другую, это можно сделать без каких-либо изменений в коде. Поддерживает GET, POST, загрузку и скачивание файлов и т.д.; в настоящее время поддерживаются следующие проекты: OkHttp3, Apache HttpComponents, HttpURLConnection, Jodd-Http.

Эти интерфейсы охватывают практически все параметры одного HTTP запроса, а использование этих интерфейсов является простым, унифицированным, последовательным и связанным. Предоставляет максимальную поддержку для URL, Header, Body, Form и загрузки файлов.

Слово "uni" может означать уникальность, что делает этот проект довольно специальным. Также слово "uni" может означать единство, надеясь на унификацию способов отправки HTTP запросов и объединение различных реализаций HTTP клиентов на рынке.

Два ключевых преимущества проекта:

  1. Семантические интерфейсы HTTP, обеспечивающие простое, унифицированное, последовательное и связное использование интерфейсов
  2. Позволяет легко менять реализацию HTTP запроса без изменения кода### Возможности
  • Интерфейсная система SmartHttpClient: основана на Request(HttpRequest)-Response, позволяет заменять компоненты по умолчанию на конкретные для процесса
  • SmartHttpClient наследует от HttpRequestHttpClient и SimpleHttpClient, первый предоставляет запросы на основе HttpRequest, второй — простой способ передачи параметров
  • Request поддерживает цепочное вызовы, преобразование Java объектов в строки с использованием стратегий, а также поддерживает путь параметров
  • Response поддерживает преобразование строк в Java объекты с использованием стратегий
  • Поддержка загрузки и скачивания файлов
  • Поддержка HTTPS
  • Поддержка переключения между OkHttp3, ApacheHttpClient, HttpURLConnection, JoddHttp без изменения кода
  • HttpUtil поддерживает загрузку реализации в зависимости от наличия jar файла
  • Глобальная конфигурация объектов реализации, таких как JdkSmartHttpClient, может быть установлена глобально или для каждого отдельного запроса Request
  • Конфигурирование по умолчанию через Config
  • Поддержка глобального установления заголовков и параметров Query
  • Возможность добавления специальных обработчиков до и после запроса, переопределяя методы beforeTemplate и afterTemplate в SmartHttpClient
  • Поддержка прокси
  • Статические методы HttpUtil полностью делегируют SmartHttpClient интерфейсу, позволяя выполнить HTTP запрос одной командой
  • В версии 1.1.1 Request был разделён на различные типы запросов
  • В версии 1.1.12 началась поддержка использования интерфейсов, аналогичных Retrofit и MyBatis-Mapper
  • В версии 1.1.2 была добавлена поддержка глобальных межсредовых интерцепторов
  • В версии 1.1.5 добавлена возможность установки свойств в каждом HttpRequest для последующего использования
  • В версии 1.1.8 добавлена поддержка всех HTTP методов
  • В версии 2.0.0 добавлена поддержка Cookie с использованием CookieInterceptor
  • В версии 2.0.0 имя пакета было изменено на top.jfunc.http, название проекта на unihttp-all
  • В версии 2.0.5 добавлена поддержка клиентской балансировки нагрузки на основе Ribbon
  • Поддержка возобновления загрузки файлов при прерывании### Как импортировать?#### Использование исходного кода Скачайте этот проект, выполните команду gradle clean build, чтобы получить jar-файл, который можно использовать в вашем проекте. Этот проект зависит от utils.

Импорт проекта с помощью средств управления проектами

Проект уже опубликован на jcenter, mavenCentral (до версии bk-2.0.1) и jitpack (начиная с версии bk-v2.0.2)jitpack

Gradle:

[для mavenCentral и jcenter]

implementation 'top.jfunc.network:unihttp-all:${version}'

[для jitpack]

implementation 'com.gitee.xxssyyyyssxx.unihttp-all:${version}'

Maven:

<!-- https://mvnrepository.com/artifact/top.jfunc.network/httpclient -->
<dependency>
    <groupId>top.jfunc.network</groupId>
    <artifactId>unihttp-all</artifactId>
    <version>${version}</version>
</dependency>

Если вы хотите исключить ненужные jar-файлы, вы можете указать это следующим образом:

implementation('top.jfunc.network:unihttp-all:${version}') {
        exclude group: 'org.apache.httpcomponents'
        exclude group: 'com.squareup.okhttp3'
        exclude group: 'org.jodd'
}
<dependency>
    <groupId>top.jfunc.network</groupId>
    <artifactId>unihttp-all</artifactId>
    <version>${version}</version>
    <exclusions>
        <exclusion>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.jodd</groupId>
            <artifactId>jodd-http</artifactId>
        </exclusion>
    </exclusions>
</dependency>
```### Как использовать его?

**Для SmartHttpClient**

1. Вы можете использовать делегата HttpUtil для получения реализации или создать экземпляр самостоятельно;
2. В Spring Boot проектах используйте Bean для внедрения;
3. HttpUtil предоставляет полную статическую обёртку для SmartHttpClient, что позволяет сделать HTTP-запрос одной строкой кода.

```java
@Configuration
public class HttpConfig {
    @Bean("smartHttpClient")
    public SmartHttpClient smartHttpClient(){
        // Если требуется заменить реализацию HTTP или выполнить больше действий, можно настроить этот бин
        SmartHttpClient smartHttpClient = new JdkSmartHttpClient();
        // new OkHttp3SmartHttpClient();
        // new JoddSmartHttpClient();
        // new ApacheSmartHttpClient(){
            // Перезаписать некоторые методы
        };
        smartHttpClient.setConfig(Config.defaultConfig()...); // Установить baseUrl...
        return smartHttpClient;
    }
}

После получения экземпляра можно использовать все методы, определённые в интерфейсе, для HTTP-запросов.

Метод setConfig позволяет установить глобальные настройки по умолчанию для экземпляра SmartHttpClient.

https://gitee.com/xxssyyyyssxx/unihttp-all/blob/master/src/test/java/top/jfunc/http/HttpBasicTest.java

https://gitee.com/xxssyyyyssxx/unihttp-all/blob/master/src/test/java/top/jfunc/http/HttpSmartTest.java

https://gitee.com/xxssyyyyssxx/unihttp-all/blob/master/src/test/java/top/jfunc/http/DelegateTest.java

Далее приведены примеры использования:

  1. Переменная Request представляет все запросы и поддерживает цепочное программирование.
  2. Реализация интерфейса SmartHttpClient выполняет фактический запрос.
  3. Переменная Response представляет ответ, который может быть преобразован в массив байтов, строку и т.д.GET:
Response response = http.get(Request.of(url).setIgnoreResponseBody(false).setIncludeHeaders(true).addHeader("saleType", "2").setResultCharset("UTF-8"));
System.out.println(response);
System.out.println("headers:" + response.getHeaders());

String s = http.get(url);
System.out.println(s);

Request request = Request.of(url).addParam("xx", "xx").addParam("yy", "yy").addHeader("saleType", "2").setResultCharset("UTF-8");
byte[] bytes = http.getAsBytes(request);
System.out.println(bytes.length);
System.out.println(new String(bytes));

request = Request.of(url).setFile(new File("C:\\Users\\xiongshiyan\\Desktop\\yyyy.txt"));
File asFile = http.getAsFile(request);
System.out.println(asFile.getAbsolutePath());

POST:

Request request = Request.of(url).setIncludeHeaders(true).addHeader("ss", "ss").addHeader("ss", "dd").setBody("{\"name\":\"熊诗言\"}").setContentType(JSON_WITH_DEFAULT_CHARSET).setConnectionTimeout(10000).setReadTimeout(10000).setResultCharset("UTF-8");
Response post = http.post(request);
System.out.println(post.getBody());
System.out.println(post.getHeaders());

String s = http.postJson(url, "{\"name\":\"熊诗言\"}");
System.out.println(s);

request = Request.of(url).addParam("xx", "xx").addParam("yy", "yy").setContentType(FORM_URLENCODED);
Response response = http.post(request);
System.out.println(response.getBody());

UPLOAD:

FormFile formFile = new FormFile(new File("E:\\838586397836550106.jpg"), "filedata", null);
Request request = Request.of(url).addHeader("empCode", "ahg0023")
        .addHeader("phone", "15208384257").addFormFile(formFile).setIncludeHeaders(true);
Response response = httpClient.upload(request);
System.out.println(response.getBody());
System.out.println(response.getHeaders());

Множественная загрузка нескольких файлов с параметрами:

FormFile formFile = new FormFile(new File("E:\\838586397836550106.jpg"), "filedata", null);
FormFile formFile2 = new FormFile(new File("E:\\BugReport.png"), "filedata2", null);
Request request = Request.of(url).addHeader("empCode", "ahg0023")
        .addHeader("phone", "15208384257").addFormFile(formFile2).addFormFile(formFile).setIncludeHeaders(true);

request.addParam("k1", "v1").addParam("k2", "v2");
Response response = httpClient.upload(request);
System.out.println(response.getBody());
System.out.println(response.getHeaders());
```Установка глобальных параметров для `SmartHttpClient`
```java
http.setConfig(Config.defaultConfig()
            .setBaseUrl("https://fanyi.baidu.com/")
            .addDefaultHeader("xx", "xx")
            .setDefaultBodyCharset("UTF-8")
            .setDefaultResultCharset("UTF-8")
            .setDefaultConnectionTimeout(15000)
            .setDefaultReadTimeout(15000)

    //....
   );

Использование аналогично MyBatis

  1. Настройка сканирования интерфейсов HttpService.
  2. Определение следующего интерфейса:
@Configuration
public class SomeConfiguration {
    @Bean
    public SmartHttpClient smartHttpClient() {
        Config config = Config.defaultConfig().setBaseUrl("xxxxx");
        JdkSmartHttpClient smartHttpClient = new JdkSmartHttpClient();
        smartHttpClient.setConfig(config);
        return smartHttpClient;
    }

    // Конфигурация для сканирования пакета top.jfunc.network.controller.client
    @Bean
    public HttpServiceCreator httpServiceCreator(SmartHttpClient smartHttpClient) {
        return new HttpServiceCreator().setSmartHttpClient(smartHttpClient);
    }

    @Bean
    public HttpServiceScanConfigure httpServiceScanConfigure() {
        HttpServiceScanConfigure httpServiceScanConfigure = new HttpServiceScanConfigure(httpServiceCreator(smartHttpClient()));
        httpServiceScanConfigure.setAnnotationClassScan(HttpService.class);
        httpServiceScanConfigure.setScanPackages("top.jfunc.network.controller.client");
        return httpServiceScanConfigure;
    }
}
@HttpService
public interface InterfaceForTestHttpService {

    @GET
    Response request(HttpRequest httpRequest);

    @GET("/get/{q}")
    Response list(@Path("q") String q, @Query("xx") int xx);

    @GET("/get/query")
    Response queryMap(@QueryMap Map<String, String> map);

    @GET
    Response url(@Url String url);

    @GET("get/query")
    Response header(@Header("naked") String naked);

    @Headers({"xx:xiongshiyan","yy:xsy"})
    @GET("get/query")
    Response headers(@Header("naked") String naked);
}
``````markdown
        @GET("get/query")
        Ответ headerMap(@HeaderMap Map<String, String> map);



        @GET("/get/query")
        Ответ загрузка();

        @POST("/post/{id}")
        Ответ отправить(@Path("id") String id, @Body String xx);

        @Multipart
        @POST("/upload/only")
        Ответ загрузить(@Part FormFile... formFiles);
        @Multipart
        @POST("/upload/withParam")
        Ответ загрузить_с_параметрами(@Part("name") String name, @Part("age") int age, @Part FormFile... formFiles);

        @FormUrlEncoded
        @POST("/post/form")
        Ответ форма(@Field("name") String name, @Field("age") int age);
        @FormUrlEncoded
        @POST("/post/form")
        Ответ форма_map(@FieldMap Map<String, String> params);
    }

Рекомендованные лучшие практики включают:

  1. Установка body вместе с установкой Content-Type.
  2. Для одной группы запросов можно использовать один объект SmartHttpClient, который позволяет настроить некоторые параметры.
  3. Использование промежуточных обработчиков вместо переопределения методов родительского класса для достижения целей фильтрации.

Дополнительные примеры использования ждут вас. Автор может иметь ограниченные знания, поэтому любые предложения будут приняты с благодарностью.

Предоставлен тестовый проект серверной части, который можно клонировать и запустить, а затем выполнить юнит-тесты этого проекта. https://gitee.com/xxssyyyyssxx/http-server-test

Архитектурный дизайн модуля HTTP и способы его использования представлены на [CSDN блоге].

Интерфейсы HTTP-запросового класса (проектирование интерфейсов)


Проект использует параллельный двойной интерфейсный дизайн, где одна сторона предназначена для реализаторов интерфейсов — **HttpTemplate-SmartHttpTemplate**, это _функциональные интерфейсы_, основные функции которых заключаются в моделировании параметров HTTP и заголовков; другая сторона предназначена для конечных пользователей — **HttpClient-SmartHttpClient**, это _интерфейсы пользователя_. Конкретные реализации классов осуществляются путём реализации двух групп интерфейсов, последний интерфейс вызывает первый интерфейс перед выполнением. Преимущество такого подхода состоит в том, что он обеспечивает независимость между реализациями и пользователями, позволяя бесконечно улучшать реализации **HttpTemplate, SmartHttpTemplate** без существенного влияния на пользователей.

HttpTemplate, HttpClient интерфейсы основаны на методах для моделирования параметров HTTP и заголовков; SmartHttpTemplate наследуется от HttpTemplate, а SmartHttpClient интерфейс наследуется от HttpClient, и они также используют запросы для моделирования параметров HTTP и заголовков, что делает их более удобными для оптимизации и использования.

[Проектирование системы интерфейсов и описание диаграммы классов](https://gitee.com/xxssyyyyssxx/unihttp-all/blob/master/CLASS.md)

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/xxssyyyyssxx-unihttp-all.git
git@api.gitlife.ru:oschina-mirror/xxssyyyyssxx-unihttp-all.git
oschina-mirror
xxssyyyyssxx-unihttp-all
xxssyyyyssxx-unihttp-all
master