# quick-http
**Repository Path**: yangyale/quick-http
## Basic Information
- **Project Name**: quick-http
- **Description**: http接口快速调用的工具包
- **Primary Language**: Java
- **License**: LGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 40
- **Forks**: 11
- **Created**: 2018-03-19
- **Last Updated**: 2023-12-12
## Categories & Tags
**Categories**: web-dev-toolkits
**Tags**: None
## README
Quick-Http 快速调用rest接口
=================================================
### quickstart
#### 依赖
```xml
com.ipet
quick-http
1.0-SNAPSHOT
```
#### 调用
```java
//包扫描
@HttpComponentScan("com.ipet.test.rest.http")
@Configuration
@SpringBootApplication
public class ServiceExecutor {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ConfigurableApplicationContext configurableApplicationContext = new SpringApplication(ServiceExecutor.class).run(args);
new CountDownLatch(1).await();
}
}
//http interface声明
@HttpComponent
public interface HttpTestInterface {
//http request 声明
@HttpRequest(value = "http://www.qq.com",header = @Header(key = "Content-Type",value = "text/html"))
String visitQQ();
}
```
#### 特性
##### 适配6种http请求 GET,POST,HEAD,OPTIONS,PUT,DELETE,默认情况下使用GET,通过@HttpRequest注解中的method指定
```java
@HttpComponent
public interface HttpTestInterface {
@HttpRequest("https://www.baidu.com")
String visitBaidu();
@HttpRequest(value = "https://www.baidu.com",method = HttpMethod.POST)
String postBaidu();
@HttpRequest(value = "https://www.baidu.com",method = HttpMethod.PUT)
String putBaidu();
@HttpRequest(value = "https://www.baidu.com", method = HttpMethod.DELETE)
String deleteBaidu();
@HttpRequest(value = "https://www.baidu.com", method = HttpMethod.HEAD)
String headBaidu();
@HttpRequest(value = "https://www.baidu.com", method = HttpMethod.OPTIONS)
String optionsBaidu();
}
```
##### SSL请求,可以手动指定证书,默认情况下无证书处理,SSL请求根据schema自动识别,通过@HttpRequest注解中的certification指定
```java
@HttpComponent
public interface HttpTestInterface {
@HttpRequest(value="https://localhost",certification="/home/ssl/key.crt")
String visitBaidu();
}
```
##### 设置header
```java
@HttpComponent
public interface HttpTestInterface {
//方式一 直接在@HttpRequest注解中通过@Header或者@Headers注解设置固定header
@HttpRequest(value = "http://www.qq.com",header = @Header(key = "Content-Type",value = "text/html"))
String visitQQ();
//方式二 通过入参的方式设置可变header
@HttpRequest("http://www.qq.com")
String visitQQ(@Header(key = "Content-Type") String contentType);
}
```
##### 字符集设置 默认为utf-8
```java
@HttpComponent
public interface HttpTestInterface {
@HttpRequest(value = "http://www.qq.com",charset="GB2312")
String visitQQ();
}
```
##### 缓冲区大小设置 默认是8KB
```java
@HttpComponent
public interface HttpTestInterface {
@HttpRequest(url = "http://www.qq.com", bufferSize = 16 * 1024)
String visitQQ(@Header(key = "Content-Type") String contentType);
}
```
##### request请求前后支持切面操作(前后置操作类的定义需要实现相应的接口PreRequest,AfterRequest)
```java
@HttpComponent
public interface HttpTestInterface {
@HttpRequest(url = "http://www.qq.com", bufferSize = 16 * 1024, preScript = BeforeRequestScript.class, afterScript = AfterRequestScript.class)
String visitQQ(@Header(key = "Content-Type") String contentType);
}
//前置操作类BeforeRequestScript
public class BeforeRequestScript implements PreRequest {
@Override
public void setRequestMethodMetadata(RequestMethodMetadata requestMethodMetadata) {
//pass the request method metadata
}
@Override
public void doScript() {
//do your things...
}
}
//后置操作类AfterRequestScript
public class AfterRequestScript implements AfterRequest {
@Override
public void doScript() {
//do your things...
}
@Override
public void setResponse(T response) {
//pass the response object
}
@Override
public void setRequestMethodMetadata(RequestMethodMetadata requestMethodMetadata) {
//pass the request method metadata
}
}
```
##### 支持异步,且异步目前通过NIO实现,目前异步实现的时候需要注意,Future 泛型中的T不能为空或者是?,即必须要有正常的类型作为泛型
```java
@HttpComponent
public interface HttpTestInterface {
//只需要设置返回值为Future类型,自动识别为异步调用
@HttpRequest("https://www.baidu.com")
Future asyncVisitBaidu();
}
```
### version 1.1
#### 支持properties属性注入
```properties
qq.url=http://www.qq.com
```
```java
@HttpComponent
public interface HttpTestInterface {
//http request 声明
@HttpRequest(value = "${qq.url}",header = @Header(key = "Content-Type",value = "text/html"))
String visitQQ();
}
@HttpComponent("${qq.url}")
public interface HttpTestInterface {
//http request 声明
@HttpRequest(header = @Header(key = "Content-Type",value = "text/html"))
String visitQQ();
}
```