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

OSCHINA-MIRROR/xxssyyyyssxx-unihttp

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

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

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

Введение

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

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

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

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

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

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

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

Gradle:

[для mavenCentral и jcenter]

implementation 'top.jfunc.network:unihttp-jdk:${version}'
implementation 'top.jfunc.network:unihttp-apache:${version}'
implementation 'top.jfunc.network:unihttp-okhttp3:${version}'
implementation 'top.jfunc.network:unihttp-jodd:${version}'

[для jitpack]

implementation 'com.gitee.xxssyyyyssxx.unihttp:unihttp-jdk:${version}'
implementation 'com.gitee.xxssyyyyssxx.unihttp:unihttp-apache:${version}'
implementation 'com.gitee.xxssyyyyssxx.unihttp:unihttp-okhttp3:${version}'
implementation 'com.gitee.xxssyyyyssxx.unihttp:unihttp-jodd:${version}'

Maven:

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

В окружении SpringBoot импорт проще: добавьте соответствующий starter, и вы сможете использовать экземпляр SmartHttpClient. Конечно, вы можете настроить некоторые параметры.### Как использовать?

Для SmartHttpClient

  1. Вы можете использовать HttpUtil для получения реализации (загруженной с помощью ServiceLoader) или создать экземпляр самостоятельно;
  2. В проекте SpringBoot используйте Bean для внедрения;
  3. HttpUtil предоставляет полный статический прокси для интерфейса SmartHttpClient, что позволяет выполнить HTTP-запрос одной строкой кода.
  4. Определите интерфейс и пометьте его аннотацией HttpService, после настройки вы сможете внедрить интерфейс напрямую (аналогично Retrofit или Mapper).
```java
@Configuration
public class HttpConfig {

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

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

https://gitee.com/xxssyyyyssxx/unihttp/blob/master/unihttp-apache/src/test/java/top/jfunc/http/MultiRequestTest.java https://gitee.com/xxssyyyyssxx/unihttp/blob/master/unihttp-jdk/src/test/java/top/jfunc/http/MultiRequestTest.java https://gitee.com/xxssyyyyssxx/unihttp/blob/master/unihttp-jodd/src/test/java/top/jfunc/http/MultiRequestTest.java https://gitee.com/xxssyyyyssxx/unihttp/blob/master/unihttp-okhttp3/src/test/java/top/jfunc/http/MultiRequestTest.java

1. Request представляет все запросы и поддерживает цепочное программирование.
2. Реализации интерфейса SmartHttpClient выполняют реальные запросы.
3. Response представляет возвращаемую информацию и может быть преобразован в массив байтов, строку и т.д.

GET:
```java
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());

ЗАГРУЗКА:

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());
```Загрузка нескольких файлов с параметрами:
```java
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

http.setConfig(Config.defaultConfig()
            .setBaseUrl("https://fanyi.baidu.com/")
            .addDefaultHeader("xx", "xx")
            .setDefaultBodyCharset("UTF-8")
            .setDefaultResultCharset("UTF-8")
            .setDefaultConnectionTimeout(15000)
            .setDefaultReadTimeout(15000)

    //.....
   );

Аналог использования интерфейсов MyBatis1. Настройка сканирования интерфейсов HttpService 2. Определение аналогичных интерфейсов

    @Configuration
    public class SomeConfiguration{
        @Bean
        public SmartHttpClient smartHttpClient(){
            Config config = Config.defaultConfig().setBaseUrl("xxxxx");
            SmartHttpClientImpl smartHttpClient = new SmartHttpClientImpl();
            smartHttpClient.setConfig(config);
            return smartHttpClient;
        }
        // Следующие конфигурации позволяют сканировать интерфейсы, аннотированные @HttpService, в пакете 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;
        }
    }
``````markdown
@HttpService
публичный интерфейс InterfaceForTestHttpService {```markdown
    @GET
    Ответ request(HttpRequest httpRequest);

    @GET("/get/{q}")
    Ответ list(@Path("q") String q, @Query("xx") int xx);
    @GET("/get/query")
    Ответ queryMap(@QueryMap Map<String, String> map);
    @GET
    Ответ url(@Url String url);

    @GET("get/query")
    Ответ header(@Header("naked") String naked);

    @Headers({"xx:xiongshiyan","yy:xsy"})
    @GET("get/query")
    Ответ headers(@Header("naked") String naked);

    @GET("get/query")
    Ответ headerMap(@HeaderMap Map<String, String> map);



    @GET("/get/query")
    Ответ download();

    @POST("/post/{id}")
    Ответ post(@Path("id") String id, @Body String xx);

    @Multipart
    @POST("/upload/only")
    Ответ upload(@Part FormFile... formFiles);
    @Multipart
    @POST("/upload/withParam")
    Ответ uploadWithParam(@Part("name") String name, @Part("age") int age, @Part FormFile... formFiles);

    @FormUrlEncoded
    @POST("/post/form")
    Ответ form(@Field("name") String name, @Field("age") int age);
    @FormUrlEncoded
    @POST("/post/form")
    Ответ formMap(@FieldMap Map<String, String> params);
}

```

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

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

Предоставлены тестовые проекты для сервера и клиента, которые можно клонировать и запустить.

https://gitee.com/xxssyyyyssxx/http-server-test

https://gitee.com/xxssyyyyssxx/http-client-test

Если вы хотите реализовать свой, просто расширяйте `top.jfunc.http.smart.AbstractSmartHttpClient`, 
см. реализацию `top.jfunc.http.smart.DemoImpl` для примера. Реализация методов может быть основана на httpclient-jdk, apache, okhttp3, jodd и т.д.
```Архитектурный дизайн и использование модуля http описаны на CSDN блоге.

[Интерфейс HTTP-запроса (дизайн интерфейса)](https://blog.csdn.net/xxssyyyyssxx/article/details/80715202)

[Интерфейс HTTP-запроса (множество реализаций)](https://blog.csdn.net/xxssyyyyssxx/article/details/80715837)

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

Интерфейсы **HttpTemplate** и **HttpClient** основаны на методах для моделирования параметров HTTP, заголовков и т.д. **SmartHttpTemplate** наследуется от **HttpTemplate**, а **SmartHttpClient** наследуется от **HttpClient** и основан на **Request** для моделирования параметров HTTP, заголовков и т.д. Это позволяет легче оптимизировать и использовать интерфейсы.```

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

Интерфейсы **HttpTemplate** и **HttpClient** основаны на методах для моделирования параметров HTTP, заголовков и т.д. **SmartHttpTemplate** наследуется от **HttpTemplate**, а **SmartHttpClient** наследуется от **HttpClient** и основан на **Request** для моделирования параметров HTTP, заголовков и т.д. Это позволяет легче оптимизировать и использовать интерфейсы.[Дизайн системы интерфейсов и описание классов](https://gitee.com/xxssyyyyssxx/unihttp/blob/master/CLASS.md)

---

### Класс `HttpManager`

Класс `HttpManager` является основным классом для управления HTTP-запросами. Он предоставляет методы для выполнения различных типов запросов, таких как GET, POST, PUT и DELETE.

#### Методы класса `HttpManager`

- **`init()`**  Инициализирует объект `HttpManager`.
- **`get(url, headers, successCallback, errorCallback)`**  Выполняет GET-запрос.
- **`post(url, headers, data, successCallback, errorCallback)`**  Выполняет POST-запрос.
- **`put(url, headers, data, successCallback, errorCallback)`**  Выполняет PUT-запрос.
- **`delete(url, headers, successCallback, errorCallback)`**  Выполняет DELETE-запрос.

### Класс `Request`

Класс `Request` представляет отдельный HTTP-запрос. Он используется для хранения информации о запросе и управления его жизненным циклом.

#### Методы класса `Request`

- **`init(url, method, headers, data)`**  Инициализирует объект `Request`.
- **`send(successCallback, errorCallback)`**  Отправляет запрос.
- **`abort()`**  Отменяет запрос.

### Класс `Response`

Класс `Response` представляет ответ на HTTP-запрос. Он используется для хранения информации об ответе и управления его жизненным циклом.

#### Методы класса `Response`

- **`init(statusCode, headers, body)`**  Инициализирует объект `Response`.
- **`getBody()`**  Возвращает тело ответа.
- **`getStatusCode()`**  Возвращает код состояния ответа.

### Пример использования

```javascript
const httpManager = new HttpManager();

httpManager.init();

httpManager.get('https://example.com/api/data', {}, 
  (response) => {
    console.log('GET request successful:', response.getBody());
  },
  (error) => {
    console.error('GET request failed:', error);
  }
);

httpManager.post('https://example.com/api/data', {}, 
  { key: 'value' }, 
  (response) => {
    console.log('POST request successful:', response.getBody());
  },
  (error) => {
    console.error('POST request failed:', error);
  }
);
```

---

### Зависимости

Для работы с классом `HttpManager` необходимы следующие зависимости:

- **`axios`**  HTTP клиент для браузеров и Node.js.
- **`lodash`**  Библиотека для работы с объектами и коллекциями.

### Установка

Для установки зависимостей выполните следующую команду:

```bash
npm install axios lodash
```

### Лицензия

Этот проект лицензирован под лицензией MIT.

---

### Контакты

Если у вас есть вопросы или предложения, пожалуйста, свяжитесь с нами по адресу: `support@example.com`.

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
Java
Apache-2.0
Отмена

Участники

все

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

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