## 一、概述
这里描述服务的消费方,如何接入本平台的微服务接口;
这里将提供一个简单的例子,来说明如何编写接入代码;
除了常规逻辑编程之外,考虑到异构系统的特点,我们给出了一个客户端编程的编程规范,建议客户端编程遵循;
>[danger]
> 1、接口服务自身的设计与开发是基于BASE理论。因此,也强烈建议代码编写者遵循该理论;程序开发者必需考虑接口服务器因机房网络故障、域名解析故障、例行检修、程序升级、依赖服务中断等因素导致当前服务不可用。因此,业务逻辑的编写必须严格的核对响应码,并且必须编写消费接口服务的异常分支逻辑;
> 2、只有responseCode为1,才说明您的api执行成功,其他的任何数字都是失败的,只是失败的原因不同;
## 二、例程
为了方便客户端编程,这里提供了一个完整的客户端调用api示范,基于java代码编写,您可以直接复制过去,修改参数运行;
签名算法:
```
private static String getParamStringByMap(Map<String, String> paramMap)
{
TreeMap map = new TreeMap();
for (Map.Entry<String, String> me : paramMap.entrySet())
{
if (!me.getKey().equalsIgnoreCase("sign"))
{
map.put(me.getKey(), me.getValue());
}
}
return getParamStringByMap(map);
}
private static String getParamStringByMap(TreeMap<String, String> paramMap)
{
StringBuilder paramString = new StringBuilder();
for (Map.Entry<String, String> me : paramMap.entrySet())
{
paramString.append(me.getKey()).append("=").append(me.getValue()).append("&");
}
return paramString.toString().substring(0, paramString.toString().length() - 1);
}
private static String encodeHex(byte[] bytes)
{
StringBuffer buf = new StringBuffer(bytes.length * 2);
for (int i = 0; i < bytes.length; i++)
{
if (((int) bytes[i] & 0xff) < 0x10)
{
buf.append("0");
}
buf.append(Long.toString((int) bytes[i] & 0xff, 16));
}
return buf.toString();
}
public static synchronized String encryptByMD5(String data)
{
try
{
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(data.getBytes());
return encodeHex(digest.digest());
}
catch (NoSuchAlgorithmException nsae)
{
nsae.printStackTrace();
return null;
}
}
public static String generateSign(Map<String, String> parameterMaps, String appSecret)
{
String para = getParamStringByMap(parameterMaps);
return encryptByMD5(new StringBuilder(encryptByMD5(para)).append(appSecret).toString());
}
```
调用:
```
static Logger logger = LoggerFactory.getLogger(Sample.class);
public static void main(String[] args)
{
Log4jV2Util.initLog4jV2TestEnv();
String serviceUrl = "http://ip:port/oauth/service/test/validation";
String appId = "s123";
String appSecret = "axbdedgefger";
Map<String, String> paramap = new HashMap();
paramap.put("appId", appId);
paramap.put("timeStamp", String.valueOf(new Date().getTime()));
paramap.put("sign", Sign.generateSign(paramap, appSecret));
//签名参数放到最后计算再传入
String result = null;
try
{
result = HttpPostUtil.executeAction(serviceUrl, paramap, null);
}
catch (Exception e)
{
e.printStackTrace();
}
logger.warn(result);
}
```
- 前言
- 01、系统平台
- 系统管理
- 组织类型
- 单位管理
- 基本功能
- SAAS功能
- 组织管理
- 角色管理
- 人员管理
- 账号管理
- 账户体系
- 账号绑定
- 账号锁定
- 团队管理
- 模板管理
- 补丁管理
- 字段管理
- 静态字典
- 动态字典
- 系统配置
- 菜单配置
- 路由配置
- 编码规则
- 访问控制
- 系统参数
- 字典配置
- 参数定义
- 参数配置
- 属性定义
- 属性设置
- 树形定义
- 树形设置
- 系统监控
- 业务维护
- 工作监控
- 调度监控
- 导入监控
- 日志管理
- 在线监控
- 附件管理
- 附件监控
- 附件应用
- 附件授权
- 上传监控
- 字段监控
- 系统提醒
- 场景配置
- 事件监控
- 提醒记录
- 事件历史
- 日期设置
- 节假日期
- 工作时间
- 日历编制
- 工作日历
- 开放平台
- 微信应用
- 配置信息
- 更新菜单
- 钉钉应用
- 配置信息
- 开放服务
- 应用设置
- 服务管理
- 请求监控
- 请求跟踪
- 移动应用
- 发布管理
- 导航菜单
- 个人管理
- 个人资料
- 内部消息
- 短信中心
- 流程管理
- 流程定义
- 流程环节
- 处理人
- 流程提醒
- 流程签收
- 流程目录
- 流程微调
- 转移动作
- 定义校验
- 流程绑定
- 流程实体设定
- 单业务多流程
- 动态表单绑定
- 环节字段设定
- 转移路由设定
- 流程监控
- 流程催办
- 流程会话
- 流程启动
- 通用待办
- 流程驱动
- 通用已办
- 示范实例
- 流程启动
- 流程待办
- 流程已办
- 常见问题
- 表单管理
- 预留字段
- 字段定义
- 业务应用
- 动态辅表
- 辅表定义
- 辅表应用
- 辅表监控
- 动态主表
- 主表定义
- 业务定义
- 元数据
- 产生机制
- 应用场景
- 02、技术平台
- 重要组件
- 表单引擎
- 流程引擎
- 基础设施
- 系统安全
- 服务集成
- 核心组件
- 核心平台
- 调度容器
- 代码调试
- 相关配置
- 常见问题
- 多线程
- 工作容器
- 开放服务
- 富客户端
- 代理容器
- https
- SSLPinning
- 03、手机应用
- 参数配置
- 技术平台
- 功能设计
- 系统功能
- 应用升级
- 业务模块
- 04、微信应用
- 参数配置
- 多公众号
- 技术平台
- 业务功能
- 平台功能
- 微信客服
- 微信公号
- 05、开放服务
- 接入示例
- 实施方案
- nginx安装
- nginx配置
- nginx运行
- nginx限流
- 实现方案
- 业务操作
- 代码示意
- 06、常见问题
- 性能优化
- 启动优化
- 解决方案
- 实体操作冲突
- 算法说明
- 检验算法
- 注意事项
- 浏览器
- 插件
- 邮箱配置
- 系统维护
- 维护日志
- 维护脚本
- 开发环境
- 07、版权信息
- 平台版权
- 产品版权
- 后记