From 9d8891e49b225ab73446e4791604a2946ffcc63e Mon Sep 17 00:00:00 2001 From: tanghc Date: Sat, 4 May 2019 17:17:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E8=87=AA=E5=AE=9A=E4=B9=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docs/_sidebar.md | 44 +++--- doc/docs/files/10095_SDK开发.md | 2 +- .../files/10099_更改数据节点名称.md | 69 +++++++++ doc/docs/files/10100_对接前端.md | 145 ++++++++++++++++++ .../sop/gatewaycommon/bean/ApiConfig.java | 7 + .../manager/AbstractConfiguration.java | 34 ++++ .../result/BaseExecutorAdapter.java | 9 +- .../result/CustomDataNameBuilder.java | 30 ++++ .../gatewaycommon/result/DataNameBuilder.java | 13 ++ .../result/DefaultDataNameBuilder.java | 28 ++++ .../sdk-csharp/SDKCSharp/Client/OpenClient.cs | 16 +- .../SDKCSharp/Common/CustomDataNameBuilder.cs | 27 ++++ .../SDKCSharp/Common/DataNameBuilder.cs | 13 ++ .../Common/DefaultDataNameBuilder.cs | 20 +++ .../sdk-csharp/SDKCSharp/Common/OpenConfig.cs | 9 +- .../sdk-csharp/SDKCSharp/Common/SdkConfig.cs | 2 + sop-sdk/sdk-csharp/SDKCSharp/Program.cs | 1 + .../com/gitee/sop/sdk/client/OpenClient.java | 13 +- .../sop/sdk/common/CustomDataNameBuilder.java | 30 ++++ .../gitee/sop/sdk/common/DataNameBuilder.java | 13 ++ .../sdk/common/DefaultDataNameBuilder.java | 28 ++++ .../com/gitee/sop/sdk/common/OpenConfig.java | 5 + .../com/gitee/sop/sdk/common/SdkConfig.java | 2 + 23 files changed, 515 insertions(+), 45 deletions(-) create mode 100644 doc/docs/files/10099_更改数据节点名称.md create mode 100644 doc/docs/files/10100_对接前端.md create mode 100644 sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/CustomDataNameBuilder.java create mode 100644 sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DataNameBuilder.java create mode 100644 sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DefaultDataNameBuilder.java create mode 100644 sop-sdk/sdk-csharp/SDKCSharp/Common/CustomDataNameBuilder.cs create mode 100644 sop-sdk/sdk-csharp/SDKCSharp/Common/DataNameBuilder.cs create mode 100644 sop-sdk/sdk-csharp/SDKCSharp/Common/DefaultDataNameBuilder.cs create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/CustomDataNameBuilder.java create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DataNameBuilder.java create mode 100644 sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DefaultDataNameBuilder.java diff --git a/doc/docs/_sidebar.md b/doc/docs/_sidebar.md index 0edabe68..8e701ef0 100644 --- a/doc/docs/_sidebar.md +++ b/doc/docs/_sidebar.md @@ -1,23 +1,25 @@ -* [首页](/?t=1556455222293) +* [首页](/?t=1556955558296) * 开发文档 - * [快速体验](files/10010_快速体验.md?t=1556455222295) - * [项目接入到SOP](files/10011_项目接入到SOP.md?t=1556455222316) - * [新增接口](files/10020_新增接口.md?t=1556455222316) - * [业务参数校验](files/10030_业务参数校验.md?t=1556455222316) - * [错误处理](files/10040_错误处理.md?t=1556455222317) - * [编写文档](files/10041_编写文档.md?t=1556455222317) - * [接口交互详解](files/10050_接口交互详解.md?t=1556455222317) - * [easyopen支持](files/10070_easyopen支持.md?t=1556455222317) - * [使用签名校验工具](files/10080_使用签名校验工具.md?t=1556455222317) - * [ISV管理](files/10085_ISV管理.md?t=1556455222317) - * [路由授权](files/10090_路由授权.md?t=1556455222317) - * [接口限流](files/10092_接口限流.md?t=1556455222317) - * [SDK开发](files/10095_SDK开发.md?t=1556455222317) - * [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1556455222318) - * [应用授权](files/10097_应用授权.md?t=1556455222318) + * [快速体验](files/10010_快速体验.md?t=1556955558299) + * [项目接入到SOP](files/10011_项目接入到SOP.md?t=1556955558316) + * [新增接口](files/10020_新增接口.md?t=1556955558316) + * [业务参数校验](files/10030_业务参数校验.md?t=1556955558316) + * [错误处理](files/10040_错误处理.md?t=1556955558316) + * [编写文档](files/10041_编写文档.md?t=1556955558316) + * [接口交互详解](files/10050_接口交互详解.md?t=1556955558317) + * [easyopen支持](files/10070_easyopen支持.md?t=1556955558317) + * [使用签名校验工具](files/10080_使用签名校验工具.md?t=1556955558317) + * [ISV管理](files/10085_ISV管理.md?t=1556955558317) + * [路由授权](files/10090_路由授权.md?t=1556955558317) + * [接口限流](files/10092_接口限流.md?t=1556955558317) + * [SDK开发](files/10095_SDK开发.md?t=1556955558317) + * [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1556955558317) + * [应用授权](files/10097_应用授权.md?t=1556955558317) + * [更改数据节点名称](files/10099_更改数据节点名称.md?t=1556955558318) + * [对接前端](files/10100_对接前端.md?t=1556955558318) * 原理分析 - * [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1556455222318) - * [原理分析之路由存储](files/90011_原理分析之路由存储.md?t=1556455222318) - * [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1556455222318) - * [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1556455222318) - * [常见问题](files/90100_常见问题.md?t=1556455222318) + * [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1556955558318) + * [原理分析之路由存储](files/90011_原理分析之路由存储.md?t=1556955558318) + * [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1556955558318) + * [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1556955558318) + * [常见问题](files/90100_常见问题.md?t=1556955558318) diff --git a/doc/docs/files/10095_SDK开发.md b/doc/docs/files/10095_SDK开发.md index 813e8fec..d537c5c7 100644 --- a/doc/docs/files/10095_SDK开发.md +++ b/doc/docs/files/10095_SDK开发.md @@ -21,7 +21,7 @@ SDK依赖了三个jar包 - 参数:name 故事名称 - 返回信息 -``` +```json { "alipay_story_find_response": { "msg": "Success", diff --git a/doc/docs/files/10099_更改数据节点名称.md b/doc/docs/files/10099_更改数据节点名称.md new file mode 100644 index 00000000..0c5965b9 --- /dev/null +++ b/doc/docs/files/10099_更改数据节点名称.md @@ -0,0 +1,69 @@ +# 更改数据节点名称 + +针对`alipay.story.find`接口,它的返回结果如下: + +```json +{ + "alipay_story_find_response": { + "msg": "Success", + "code": "10000", + "name": "白雪公主", + "id": 1, + "gmtCreate": 1554193987378 + }, + "sign": "xxxxx" +} +``` + +其中`alipay_story_find_response`是它的数据节点。规则是: + +> 将接口名中的"."转换成"_",后面加上"_response"。 + +代码实现如下: + +```java +String method = "alipay.story.find"; +return method.replace('.', '_') + "_response"; +``` + +详见`DefaultDataNameBuilder.java` + +如果要更改数据节点,比如`result`,可使用`CustomDataNameBuilder.java`。 + +```java +@Configuration +public class ZuulConfig extends AlipayZuulConfiguration { + + static { + ... + ApiConfig.getInstance().setDataNameBuilder(new CustomDataNameBuilder()); + ... + } + +} +``` + +设置后,网关统一的返回结果如下: + +```json +{ + "result": { + ... + }, + "sign": "xxxxx" +} +``` + +此外,构造方法可指定自定义字段名称:`new CustomDataNameBuilder("data");`。 +设置后,数据节点将变成`data` + +```json +{ + "data": { + ... + }, + "sign": "xxxxx" +} +``` + +**注**:网关设置了CustomDataNameBuilder后,SDK也要做相应的更改:`SdkConfig.dataNameBuilder = new CustomDataNameBuilder();` diff --git a/doc/docs/files/10100_对接前端.md b/doc/docs/files/10100_对接前端.md new file mode 100644 index 00000000..32614280 --- /dev/null +++ b/doc/docs/files/10100_对接前端.md @@ -0,0 +1,145 @@ +# 对接前端 + +开放平台一般对接服务端应用,开发者使用SDK来调用接口。 +理论上来说,只要是客户端程序,都可以调用网关接口。因此,同样可以对接前端应用(H5、小程序、App)。 + +针对H5页面,配置方式如下: + +- 网关关闭签名校验。`ApiConfig.getInstance().setIgnoreValidate(true);` + +由于是网页调用接口,把秘钥放在前端意义不大,干脆直接关闭签名校验。 + +- 设置统一的数据节点 + +```java +@Configuration +public class ZuulConfig extends AlipayZuulConfiguration { + + static { + ... + ApiConfig.getInstance().setIgnoreValidate(true); + ApiConfig.getInstance().setDataNameBuilder(new CustomDataNameBuilder()); + ... + } + +} +``` + +设置后,网关统一的返回结果如下: + +```json +{ + "result": { + ... + }, + "sign": "xxxxx" +} +``` + +- 封装请求工具【可选】 + +封装请求,方便调用,针对vue的封装如下: + +```js +// 创建axios实例 +const client = axios.create({ + baseURL: process.env.BASE_API, // api 的 base_url + timeout: 5000, // 请求超时时间 + headers: { 'Content-Type': 'application/x-www-form-urlencoded' } +}) + +const RequestUtil = { + /** + * 请求接口 + * @param method 接口名,如:goods.get,goods.get + * @param version 版本号,如:1.0 + * @param data 请求数据,json格式 + * @param callback 成功回调 + * @param errorCallback 失败回调 + */ + post: function(method, version, data, callback, errorCallback) { + client.request({ + method: method, + version: version, + biz_content: JSON.stringify(data) + }).then(function(response) { + const resp = response.result + const code = resp.code + // 成功,网关正常且业务正常 + if (code === '10000' && !resp.sub_code) { + callback(resp) + } else { + // 报错 + Message({ + message: resp.msg, + type: 'error', + duration: 5 * 1000 + }) + } + }) + .catch(function(error) { + console.log('err' + error) // for debug + errorCallback && errorCallback(error) + }) + } +} + +export default RequestUtil +``` + +jQuery版本如下: + +```js +var RequestUtil = { + /** + * 请求接口 + * @param method 接口名,如:goods.get,goods.get + * @param version 版本号,如:1.0 + * @param data 请求数据,json格式 + * @param callback 成功回调 + * @param errorCallback 失败回调 + */ + post: function(method, version, data, callback, errorCallback) { + $.ajax({ + url: 'http://localhost:8081/api' // 网关url + , type: 'post' + , headers: { 'Content-Type': 'application/x-www-form-urlencoded' } + , data: { + method: method, + version: version, + biz_content: JSON.stringify(data) + } + ,success:function(response){ + var resp = response.result + var code = resp.code + // 成功,网关正常且业务正常 + if (code === '10000' && !resp.sub_code) { + callback(resp) + } else { + // 报错 + alert(resp.msg); + } + } + , error: function(error) { + errorCallback && errorCallback(error) + } + }); + } +} +``` + +jQuery调用示例: + +```js +$(function () { + var data = { + id: 1 + ,name: '葫芦娃' + } + RequestUtil.post('alipay.story.get', '1.0', data, function (result) { + console.log(result) + }); +}) +``` + + diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/ApiConfig.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/ApiConfig.java index e976cad9..5f198eab 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/ApiConfig.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/ApiConfig.java @@ -10,6 +10,8 @@ import com.gitee.sop.gatewaycommon.manager.DefaultRouteConfigManager; import com.gitee.sop.gatewaycommon.manager.IsvRoutePermissionManager; import com.gitee.sop.gatewaycommon.manager.RouteConfigManager; import com.gitee.sop.gatewaycommon.param.ParamBuilder; +import com.gitee.sop.gatewaycommon.result.DataNameBuilder; +import com.gitee.sop.gatewaycommon.result.DefaultDataNameBuilder; import com.gitee.sop.gatewaycommon.result.ResultExecutor; import com.gitee.sop.gatewaycommon.secret.CacheIsvManager; import com.gitee.sop.gatewaycommon.secret.IsvManager; @@ -108,6 +110,11 @@ public class ApiConfig { */ private LimitManager limitManager = new DefaultLimitManager(); + /** + * 构建数据节点名称 + */ + private DataNameBuilder dataNameBuilder = new DefaultDataNameBuilder(); + // -------- fields --------- /** diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/AbstractConfiguration.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/AbstractConfiguration.java index efac38d6..d50671ee 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/AbstractConfiguration.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/AbstractConfiguration.java @@ -7,7 +7,11 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; import javax.annotation.PostConstruct; @@ -28,6 +32,36 @@ public class AbstractConfiguration implements ApplicationContextAware { applicationContext = ctx; } + /** + * 跨域过滤器 + * + * @return + */ + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", corsConfiguration()); + return new CorsFilter(source); + } + + protected CorsFilter createCorsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + this.registerCorsConfiguration(source); + return new CorsFilter(source); + } + + protected void registerCorsConfiguration(UrlBasedCorsConfigurationSource source) { + source.registerCorsConfiguration("/**", corsConfiguration()); + } + + protected CorsConfiguration corsConfiguration() { + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); + corsConfiguration.addAllowedHeader("*"); + corsConfiguration.addAllowedMethod("*"); + return corsConfiguration; + } + @PostConstruct public final void after() { if (RouteRepositoryContext.getRouteRepository() == null) { diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java index 5978dd3a..67c2d793 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java @@ -2,6 +2,7 @@ package com.gitee.sop.gatewaycommon.result; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.gitee.sop.gatewaycommon.bean.ApiConfig; import com.gitee.sop.gatewaycommon.bean.ApiContext; import com.gitee.sop.gatewaycommon.bean.SopConstants; import com.gitee.sop.gatewaycommon.bean.TargetRoute; @@ -23,11 +24,8 @@ public abstract class BaseExecutorAdapter implements ResultExecutor private static final ErrorMeta ISP_UNKNOW_ERROR_META = ErrorEnum.ISP_UNKNOW_ERROR.getErrorMeta(); private static final ErrorMeta ISP_BIZ_ERROR = ErrorEnum.BIZ_ERROR.getErrorMeta(); - private static final char DOT = '.'; - private static final char UNDERLINE = '_'; public static final String GATEWAY_CODE_NAME = "code"; public static final String GATEWAY_MSG_NAME = "msg"; - public static final String DATA_SUFFIX = "_response"; public static final String ARRAY_START = "["; public static final String ARRAY_END = "]"; public static final String ROOT_JSON = "{'items':%s}".replace("'", "\""); @@ -137,8 +135,9 @@ public abstract class BaseExecutorAdapter implements ResultExecutor } // 点换成下划线 - String method = name.replace(DOT, UNDERLINE); - ret.put(method + DATA_SUFFIX, jsonObjectService); + DataNameBuilder dataNameBuilder = ApiConfig.getInstance().getDataNameBuilder(); + String method = dataNameBuilder.build(name); + ret.put(method, jsonObjectService); ret.put(ParamNames.SIGN_NAME, sign); return ret.toJSONString(); } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/CustomDataNameBuilder.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/CustomDataNameBuilder.java new file mode 100644 index 00000000..5e710d1f --- /dev/null +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/CustomDataNameBuilder.java @@ -0,0 +1,30 @@ +package com.gitee.sop.gatewaycommon.result; + +/** + * 返回固定的 + * { + * "result": { + * "code": "20000", + * "msg": "Service Currently Unavailable", + * "sub_code": "isp.unknow-error", + * "sub_msg": "系统繁忙" + * }, + * "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE" + * } + * @author tanghc + */ +public class CustomDataNameBuilder implements DataNameBuilder { + private String dataName = "result"; + + public CustomDataNameBuilder() { + } + + public CustomDataNameBuilder(String dataName) { + this.dataName = dataName; + } + + @Override + public String build(String method) { + return dataName; + } +} diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DataNameBuilder.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DataNameBuilder.java new file mode 100644 index 00000000..ce898569 --- /dev/null +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DataNameBuilder.java @@ -0,0 +1,13 @@ +package com.gitee.sop.gatewaycommon.result; + +/** + * @author tanghc + */ +public interface DataNameBuilder { + /** + * 构建数据节点名称 + * @param method + * @return + */ + String build(String method); +} diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DefaultDataNameBuilder.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DefaultDataNameBuilder.java new file mode 100644 index 00000000..987041ec --- /dev/null +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/DefaultDataNameBuilder.java @@ -0,0 +1,28 @@ +package com.gitee.sop.gatewaycommon.result; + +/** + * 将方法名中的"."转成"_"并在后面追加"_response"
+ * 如:alipay.trade.order.settle --> alipay_trade_order_settle_response
+ *
+ * {
+ *     "alipay_trade_order_settle_response": {
+ *         "code": "20000",
+ *         "msg": "Service Currently Unavailable",
+ *         "sub_code": "isp.unknow-error",
+ *         "sub_msg": "系统繁忙"
+ *     },
+ *     "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
+ * }
+ * 
+ * @author tanghc + */ +public class DefaultDataNameBuilder implements DataNameBuilder { + private static final char DOT = '.'; + private static final char UNDERLINE = '_'; + private static final String DATA_SUFFIX = "_response"; + + @Override + public String build(String method) { + return method.replace(DOT, UNDERLINE) + DATA_SUFFIX; + } +} diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Client/OpenClient.cs b/sop-sdk/sdk-csharp/SDKCSharp/Client/OpenClient.cs index ebf97cd8..5e4eb767 100644 --- a/sop-sdk/sdk-csharp/SDKCSharp/Client/OpenClient.cs +++ b/sop-sdk/sdk-csharp/SDKCSharp/Client/OpenClient.cs @@ -22,10 +22,6 @@ namespace SDKCSharp.Client private static OpenConfig DEFAULT_CONFIG = new OpenConfig(); - private static char DOT = '.'; - private static char UNDERLINE = '_'; - public static string DATA_SUFFIX = "_response"; - private Dictionary header = new Dictionary(); @@ -35,6 +31,7 @@ namespace SDKCSharp.Client private OpenConfig openConfig; private OpenRequest openRequest; + private DataNameBuilder dataNameBuilder; public OpenClient(string url, string appId, string privateKey) : this(url, appId, privateKey,false, DEFAULT_CONFIG) @@ -59,6 +56,7 @@ namespace SDKCSharp.Client { this.privateKey = LoadCertificateFile(privateKey); } + this.dataNameBuilder = openConfig.DataNameBuilder; } /// @@ -111,9 +109,9 @@ namespace SDKCSharp.Client string sign = SignUtil.CreateSign(form, privateKey, request.Charset, request.SignType); form[this.openConfig.SignName] = sign; - string resp = this.doExecute(url, requestForm, header); + string resp = this.DoExecute(url, requestForm, header); - return this.parseResponse(resp, request); + return this.ParseResponse(resp, request); } /// @@ -123,7 +121,7 @@ namespace SDKCSharp.Client /// 请求内容 /// 请求header /// 返回服务器响应内容 - protected virtual String doExecute(String url, RequestForm requestForm, Dictionary header) + protected virtual String DoExecute(String url, RequestForm requestForm, Dictionary header) { return openRequest.Request(this.url, requestForm, header); } @@ -135,9 +133,9 @@ namespace SDKCSharp.Client /// 服务器响应内容 /// 请求Request /// 返回Response - protected virtual T parseResponse(string resp, BaseRequest request) where T: BaseResponse { + protected virtual T ParseResponse(string resp, BaseRequest request) where T: BaseResponse { string method = request.Method; - string dataName = method.Replace(DOT, UNDERLINE) + DATA_SUFFIX; + string dataName = this.dataNameBuilder.Build(method); Dictionary jsonObject = JsonUtil.ParseToDictionary(resp); object data = jsonObject[dataName]; string jsonData = data == null ? "{}" : data.ToString(); diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Common/CustomDataNameBuilder.cs b/sop-sdk/sdk-csharp/SDKCSharp/Common/CustomDataNameBuilder.cs new file mode 100644 index 00000000..8509468a --- /dev/null +++ b/sop-sdk/sdk-csharp/SDKCSharp/Common/CustomDataNameBuilder.cs @@ -0,0 +1,27 @@ +using System; +namespace SDKCSharp.Common +{ + /// + /// 返回固定的dataName + /// + public class CustomDataNameBuilder: DataNameBuilder + { + + private string dataName = "result"; + + public CustomDataNameBuilder() + { + } + + + public CustomDataNameBuilder(string dataName) + { + this.dataName = dataName; + } + + public string Build(string method) + { + return dataName; + } + } +} diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Common/DataNameBuilder.cs b/sop-sdk/sdk-csharp/SDKCSharp/Common/DataNameBuilder.cs new file mode 100644 index 00000000..1df8d372 --- /dev/null +++ b/sop-sdk/sdk-csharp/SDKCSharp/Common/DataNameBuilder.cs @@ -0,0 +1,13 @@ +using System; +namespace SDKCSharp.Common +{ + public interface DataNameBuilder + { + /// + /// 构建数据节点名称 + /// + /// 返回数据节点名称. + /// 方法名. + string Build(string method); + } +} diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Common/DefaultDataNameBuilder.cs b/sop-sdk/sdk-csharp/SDKCSharp/Common/DefaultDataNameBuilder.cs new file mode 100644 index 00000000..b19b8047 --- /dev/null +++ b/sop-sdk/sdk-csharp/SDKCSharp/Common/DefaultDataNameBuilder.cs @@ -0,0 +1,20 @@ +using System; +namespace SDKCSharp.Common +{ + /// + /// 将方法名中的"."转成"_"并在后面追加"_response"。 + /// 如:alipay.trade.order.settle --> alipay_trade_order_settle_response。 + /// + public class DefaultDataNameBuilder : DataNameBuilder + { + + private const char DOT = '.'; + private const char UNDERLINE = '_'; + private const string DATA_SUFFIX = "_response"; + + public string Build(string method) + { + return method.Replace(DOT, UNDERLINE) + DATA_SUFFIX; + } + } +} diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Common/OpenConfig.cs b/sop-sdk/sdk-csharp/SDKCSharp/Common/OpenConfig.cs index 9af0912e..e77f132f 100644 --- a/sop-sdk/sdk-csharp/SDKCSharp/Common/OpenConfig.cs +++ b/sop-sdk/sdk-csharp/SDKCSharp/Common/OpenConfig.cs @@ -12,7 +12,7 @@ namespace SDKCSharp.Common { private String successCode = SdkConfig.SUCCESS_CODE; - + /// /// 返回码成功值 /// @@ -186,6 +186,11 @@ namespace SDKCSharp.Common public string SignTypeName { get => signTypeName; set => signTypeName = value; } - + private DataNameBuilder dataNameBuilder = SdkConfig.dataNameBuilder; + /// + /// 节点名称构造器 + /// + /// The data name builder. + public DataNameBuilder DataNameBuilder { get => dataNameBuilder; set => dataNameBuilder = value; } } } diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Common/SdkConfig.cs b/sop-sdk/sdk-csharp/SDKCSharp/Common/SdkConfig.cs index b565b5ca..b5a38cc4 100644 --- a/sop-sdk/sdk-csharp/SDKCSharp/Common/SdkConfig.cs +++ b/sop-sdk/sdk-csharp/SDKCSharp/Common/SdkConfig.cs @@ -20,5 +20,7 @@ namespace SDKCSharp.Common public static Encoding CHARSET = Encoding.UTF8; public static SignType SIGN_TYPE = SignType.RSA2; + + public static DataNameBuilder dataNameBuilder = new DefaultDataNameBuilder(); } } diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Program.cs b/sop-sdk/sdk-csharp/SDKCSharp/Program.cs index b418252f..d0d1c9de 100644 --- a/sop-sdk/sdk-csharp/SDKCSharp/Program.cs +++ b/sop-sdk/sdk-csharp/SDKCSharp/Program.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using SDKCSharp.Client; +using SDKCSharp.Common; using SDKCSharp.Model; using SDKCSharp.Request; using SDKCSharp.Response; diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java index 51b3a856..076b396e 100644 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/client/OpenClient.java @@ -2,12 +2,13 @@ package com.gitee.sop.sdk.client; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.gitee.sop.sdk.common.DataNameBuilder; import com.gitee.sop.sdk.common.OpenConfig; import com.gitee.sop.sdk.common.RequestForm; -import com.gitee.sop.sdk.sign.SopSignException; +import com.gitee.sop.sdk.exception.SdkException; import com.gitee.sop.sdk.request.BaseRequest; import com.gitee.sop.sdk.response.BaseResponse; -import com.gitee.sop.sdk.exception.SdkException; +import com.gitee.sop.sdk.sign.SopSignException; import com.gitee.sop.sdk.sign.SopSignature; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -25,16 +26,13 @@ public class OpenClient { private static final OpenConfig DEFAULT_CONFIG = new OpenConfig(); - private static final char DOT = '.'; - private static final char UNDERLINE = '_'; - public static final String DATA_SUFFIX = "_response"; - private String url; private String appId; private String privateKey; private OpenConfig openConfig; private OpenRequest openRequest; + private DataNameBuilder dataNameBuilder; public OpenClient(String url, String appId, String privateKey) { this(url, appId, privateKey, DEFAULT_CONFIG); @@ -50,6 +48,7 @@ public class OpenClient { this.openConfig = openConfig; this.openRequest = new OpenRequest(openConfig); + this.dataNameBuilder = openConfig.getDataNameBuilder(); } /** @@ -109,7 +108,7 @@ public class OpenClient { protected T parseResponse(String resp, BaseRequest request) { String method = request.getMethod(); - String dataName = method.replace(DOT, UNDERLINE) + DATA_SUFFIX; + String dataName = dataNameBuilder.build(method); JSONObject jsonObject = JSON.parseObject(resp); JSONObject data = jsonObject.getJSONObject(dataName); T t = data.toJavaObject(request.getResponseClass()); diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/CustomDataNameBuilder.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/CustomDataNameBuilder.java new file mode 100644 index 00000000..f015a85c --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/CustomDataNameBuilder.java @@ -0,0 +1,30 @@ +package com.gitee.sop.sdk.common; + +/** + * 返回固定的 + * { + * "result": { + * "code": "20000", + * "msg": "Service Currently Unavailable", + * "sub_code": "isp.unknow-error", + * "sub_msg": "系统繁忙" + * }, + * "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE" + * } + * @author tanghc + */ +public class CustomDataNameBuilder implements DataNameBuilder { + private String dataName = "result"; + + public CustomDataNameBuilder() { + } + + public CustomDataNameBuilder(String dataName) { + this.dataName = dataName; + } + + @Override + public String build(String method) { + return dataName; + } +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DataNameBuilder.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DataNameBuilder.java new file mode 100644 index 00000000..b488786c --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DataNameBuilder.java @@ -0,0 +1,13 @@ +package com.gitee.sop.sdk.common; + +/** + * @author tanghc + */ +public interface DataNameBuilder { + /** + * 构建数据节点名称 + * @param method 方法名 + * @return 返回数据节点名称 + */ + String build(String method); +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DefaultDataNameBuilder.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DefaultDataNameBuilder.java new file mode 100644 index 00000000..72cdaeb0 --- /dev/null +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/DefaultDataNameBuilder.java @@ -0,0 +1,28 @@ +package com.gitee.sop.sdk.common; + +/** + * 将方法名中的"."转成"_"并在后面追加"_response"
+ * 如:alipay.trade.order.settle --> alipay_trade_order_settle_response
+ *
+ * {
+ *     "alipay_trade_order_settle_response": {
+ *         "code": "20000",
+ *         "msg": "Service Currently Unavailable",
+ *         "sub_code": "isp.unknow-error",
+ *         "sub_msg": "系统繁忙"
+ *     },
+ *     "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
+ * }
+ * 
+ * @author tanghc + */ +public class DefaultDataNameBuilder implements DataNameBuilder { + private static final char DOT = '.'; + private static final char UNDERLINE = '_'; + private static final String DATA_SUFFIX = "_response"; + + @Override + public String build(String method) { + return method.replace(DOT, UNDERLINE) + DATA_SUFFIX; + } +} diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/OpenConfig.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/OpenConfig.java index 08164022..3b49bac8 100644 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/OpenConfig.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/OpenConfig.java @@ -45,4 +45,9 @@ public class OpenConfig { private int readTimeoutSeconds = 10; /** http写超时时间 */ private int writeTimeoutSeconds = 10; + + /** + * 构建数据节点名称 + */ + private DataNameBuilder dataNameBuilder = SdkConfig.dataNameBuilder; } diff --git a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/SdkConfig.java b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/SdkConfig.java index 573a949d..2bcd89b0 100644 --- a/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/SdkConfig.java +++ b/sop-sdk/sdk-java/src/main/java/com/gitee/sop/sdk/common/SdkConfig.java @@ -13,4 +13,6 @@ public class SdkConfig { public static String CHARSET = "UTF-8"; public static String SIGN_TYPE = "RSA2"; + + public static volatile DataNameBuilder dataNameBuilder = new DefaultDataNameBuilder(); }