可自定义数据节点

This commit is contained in:
tanghc
2019-05-04 17:17:09 +08:00
parent a6e04b6ca4
commit 9d8891e49b
23 changed files with 515 additions and 45 deletions

View File

@@ -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<string, string> header = new Dictionary<string, string>();
@@ -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;
}
/// <summary>
@@ -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<T>(resp, request);
return this.ParseResponse<T>(resp, request);
}
/// <summary>
@@ -123,7 +121,7 @@ namespace SDKCSharp.Client
/// <param name="requestForm">请求内容</param>
/// <param name="header">请求header</param>
/// <returns>返回服务器响应内容</returns>
protected virtual String doExecute(String url, RequestForm requestForm, Dictionary<string, string> header)
protected virtual String DoExecute(String url, RequestForm requestForm, Dictionary<string, string> header)
{
return openRequest.Request(this.url, requestForm, header);
}
@@ -135,9 +133,9 @@ namespace SDKCSharp.Client
/// <param name="resp">服务器响应内容</param>
/// <param name="request">请求Request</param>
/// <returns>返回Response</returns>
protected virtual T parseResponse<T>(string resp, BaseRequest<T> request) where T: BaseResponse {
protected virtual T ParseResponse<T>(string resp, BaseRequest<T> request) where T: BaseResponse {
string method = request.Method;
string dataName = method.Replace(DOT, UNDERLINE) + DATA_SUFFIX;
string dataName = this.dataNameBuilder.Build(method);
Dictionary<string, object> jsonObject = JsonUtil.ParseToDictionary(resp);
object data = jsonObject[dataName];
string jsonData = data == null ? "{}" : data.ToString();

View File

@@ -0,0 +1,27 @@
using System;
namespace SDKCSharp.Common
{
/// <summary>
/// 返回固定的dataName
/// </summary>
public class CustomDataNameBuilder: DataNameBuilder
{
private string dataName = "result";
public CustomDataNameBuilder()
{
}
public CustomDataNameBuilder(string dataName)
{
this.dataName = dataName;
}
public string Build(string method)
{
return dataName;
}
}
}

View File

@@ -0,0 +1,13 @@
using System;
namespace SDKCSharp.Common
{
public interface DataNameBuilder
{
/// <summary>
/// 构建数据节点名称
/// </summary>
/// <returns>返回数据节点名称.</returns>
/// <param name="method">方法名.</param>
string Build(string method);
}
}

View File

@@ -0,0 +1,20 @@
using System;
namespace SDKCSharp.Common
{
/// <summary>
/// 将方法名中的"."转成"_"并在后面追加"_response"。
/// 如alipay.trade.order.settle --> alipay_trade_order_settle_response。
/// </summary>
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;
}
}
}

View File

@@ -12,7 +12,7 @@ namespace SDKCSharp.Common
{
private String successCode = SdkConfig.SUCCESS_CODE;
/// <summary>
/// 返回码成功值
/// </summary>
@@ -186,6 +186,11 @@ namespace SDKCSharp.Common
public string SignTypeName { get => signTypeName; set => signTypeName = value; }
private DataNameBuilder dataNameBuilder = SdkConfig.dataNameBuilder;
/// <summary>
/// 节点名称构造器
/// </summary>
/// <value>The data name builder.</value>
public DataNameBuilder DataNameBuilder { get => dataNameBuilder; set => dataNameBuilder = value; }
}
}

View File

@@ -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();
}
}

View File

@@ -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;

View File

@@ -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 extends BaseResponse> T parseResponse(String resp, BaseRequest<T> 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());

View File

@@ -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;
}
}

View File

@@ -0,0 +1,13 @@
package com.gitee.sop.sdk.common;
/**
* @author tanghc
*/
public interface DataNameBuilder {
/**
* 构建数据节点名称
* @param method 方法名
* @return 返回数据节点名称
*/
String build(String method);
}

View File

@@ -0,0 +1,28 @@
package com.gitee.sop.sdk.common;
/**
* 将方法名中的"."转成"_"并在后面追加"_response"<br>
* 如alipay.trade.order.settle --> alipay_trade_order_settle_response<br>
* <pre>
* {
* "alipay_trade_order_settle_response": {
* "code": "20000",
* "msg": "Service Currently Unavailable",
* "sub_code": "isp.unknow-error",
* "sub_msg": "系统繁忙"
* },
* "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
* }
* </pre>
* @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;
}
}

View File

@@ -45,4 +45,9 @@ public class OpenConfig {
private int readTimeoutSeconds = 10;
/** http写超时时间 */
private int writeTimeoutSeconds = 10;
/**
* 构建数据节点名称
*/
private DataNameBuilder dataNameBuilder = SdkConfig.dataNameBuilder;
}

View File

@@ -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();
}