feat: 增加文档
This commit is contained in:
parent
e421251662
commit
839ce671d7
101
README.md
101
README.md
@ -24,6 +24,15 @@ Rest Proxy组件是本人在长期的系统对接工作中提炼出的一个可
|
||||
具体请查看开源仓库:https://git.flyfish.group/flyfish-group/rest-proxy.git
|
||||
然后demo的话请切换到`example`分支。
|
||||
|
||||
请使用maven引入依赖
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>group.flyfish</groupId>
|
||||
<artifactId>rest-proxy-core</artifactId>
|
||||
<version>1.1.2</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### 1. 定义请求源
|
||||
我们提供了非常灵活的**请求源**(Base URL)定义方式。
|
||||
|
||||
@ -233,6 +242,98 @@ public class RestProxyDemoApplication {
|
||||
### 4. 开始愉快的对接吧!
|
||||
至此,我们的快速开始教程已经完成。
|
||||
|
||||
## 结果映射处理和绑定
|
||||
大家在实现接口的时候都心照不宣的都一个习惯,那就是将接口响应增加一个包装类,样子大概是这样的:
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"code": 0,
|
||||
"message": "成功",
|
||||
"result": {
|
||||
"name": "名称",
|
||||
"code": "编码"
|
||||
}
|
||||
}
|
||||
```
|
||||
但是我们在写Java代码时却不这么写。于是乎,这里就涉及到了一个**结果解包**的逻辑。
|
||||
|
||||
默认情况下,Rest代理器不会对结果进行解包。但是你可以添加`@AutoMapping`注解来标记自动解包。
|
||||
|
||||
这里我们提供了一个默认的数据结构用于解包的缺省行为,具体的格式就是**上面的例子**所定义的那样。
|
||||
如果您要调用的系统不以该接口包装格式返回,需要您自己书写相应逻辑。您需要实现`RestResultMapping`接口并正确书写`map`和`resolve`方法。
|
||||
|
||||
`map`方法用于实现解包逻辑,也就是**如何从包装的结果中取得真实的数据**,比如上面的`result`字段。
|
||||
此外,该方法内建议自行处理异常结果`code`,并主动抛出`RestClientException`。
|
||||
|
||||
`convert`方法用于将我们在`@RestService`中定义的`method`的返回值进行包装,保证返回真实的类型。
|
||||
比如方法签名为:`User getUser()`,包装类为:`Result`,这时我们需要返回`Result<User>`类型,可以使用我们提供的工具类`TypeResolveUtils`
|
||||
中的`wrap`方法进行包装。具体可以参考下面的例子。
|
||||
|
||||
以下是系统内的默认实现逻辑,仅供参考:
|
||||
```java
|
||||
/**
|
||||
* 默认缺省的结果映射
|
||||
*
|
||||
* @author wangyu
|
||||
*/
|
||||
@Slf4j
|
||||
public class DefaultRestResultMapping implements RestResultMapping {
|
||||
|
||||
/**
|
||||
* 模糊的结果映射
|
||||
*
|
||||
* @param body 结果
|
||||
* @return 映射后的结果
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> T map(Object body) throws RestClientException {
|
||||
// 多一步类型检查,保证转换的结果类型正确
|
||||
if (body instanceof RestResult) {
|
||||
RestResult<?> result = (RestResult<?>) body;
|
||||
if (result.isSuccess()) {
|
||||
return (T) result.getResult();
|
||||
}
|
||||
log.error("【RestProxy】请求发生异常!状态码:{},时间:{},信息:{}", result.getCode(),
|
||||
DateUtils.formatDate(new Date(result.getTimestamp()), "yyyy-MM-dd HH:mm:ss"), result.getMessage());
|
||||
throw new RestClientException(result.getMessage());
|
||||
}
|
||||
return (T) body;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析返回类型
|
||||
*
|
||||
* @param resultType 返回类型
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public Type resolve(Type resultType) {
|
||||
return TypeResolveUtils.wrap(resultType, RestResult.class);
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
完成上面的步骤后,就可以使用`@AutoMapping`注解标记解包处理了!
|
||||
最后实现的效果,就是从`TestService`到`TestUnwrapService`,如下:
|
||||
```java
|
||||
@RestService
|
||||
public interface TestService {
|
||||
|
||||
RestResult<User> getUser();
|
||||
}
|
||||
```
|
||||
```java
|
||||
@RestService
|
||||
@AutoMapping(DefaultRestResultMapping.class)
|
||||
public interface TestUnwrapService {
|
||||
|
||||
User getUser();
|
||||
}
|
||||
```
|
||||
|
||||
## 定制您的rest客户端
|
||||
我们提供了许多丰富的定制选项来帮助您更好的使用组件。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user