Этот проект представляет собой интерфейсы, определяющие все реализации HTTP протокола для описания HTTP запроса. Использующие сторонние библиотеки могут работать с одним и тем же набором семантических интерфейсов; при необходимости замены одной реализации HTTP на другую, это можно сделать без каких-либо изменений в коде. Поддерживает GET, POST, загрузку и скачивание файлов и т.д.; в настоящее время поддерживаются следующие проекты: OkHttp3
, Apache HttpComponents
, HttpURLConnection
, Jodd-Http
.
Эти интерфейсы охватывают практически все параметры одного HTTP запроса, а использование этих интерфейсов является простым, унифицированным, последовательным и связанным. Предоставляет максимальную поддержку для URL, Header, Body, Form и загрузки файлов.
Слово "uni" может означать уникальность, что делает этот проект довольно специальным. Также слово "uni" может означать единство, надеясь на унификацию способов отправки HTTP запросов и объединение различных реализаций HTTP клиентов на рынке.
Два ключевых преимущества проекта:
SmartHttpClient
: основана на Request(HttpRequest)-Response
, позволяет заменять компоненты по умолчанию на конкретные для процессаSmartHttpClient
наследует от HttpRequestHttpClient
и SimpleHttpClient
, первый предоставляет запросы на основе HttpRequest
, второй — простой способ передачи параметровRequest
поддерживает цепочное вызовы, преобразование Java объектов в строки с использованием стратегий, а также поддерживает путь параметровResponse
поддерживает преобразование строк в Java объекты с использованием стратегийOkHttp3
, ApacheHttpClient
, HttpURLConnection
, JoddHttp
без изменения кодаHttpUtil
поддерживает загрузку реализации в зависимости от наличия jar файлаJdkSmartHttpClient
, может быть установлена глобально или для каждого отдельного запроса Request
Config
beforeTemplate
и afterTemplate
в SmartHttpClient
HttpUtil
полностью делегируют SmartHttpClient
интерфейсу, позволяя выполнить HTTP запрос одной командойgradle clean build
, чтобы получить jar-файл, который можно использовать в вашем проекте. Этот проект зависит от utils.Проект уже опубликован на jcenter
, mavenCentral
(до версии bk-2.0.1) и jitpack (начиная с версии bk-v2.0.2)
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
.
Далее приведены примеры использования:
Request
представляет все запросы и поддерживает цепочное программирование.SmartHttpClient
выполняет фактический запрос.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
HttpService
.@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);
}
Рекомендованные лучшие практики включают:
body
вместе с установкой Content-Type
.SmartHttpClient
, который позволяет настроить некоторые параметры.Дополнительные примеры использования ждут вас. Автор может иметь ограниченные знания, поэтому любые предложения будут приняты с благодарностью.
Предоставлен тестовый проект серверной части, который можно клонировать и запустить, а затем выполнить юнит-тесты этого проекта. 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 )