## 一、概述
這里描述服務的消費方,如何接入本平臺的微服務接口;
這里將提供一個簡單的例子,來說明如何編寫接入代碼;
除了常規邏輯編程之外,考慮到異構系統的特點,我們給出了一個客戶端編程的編程規范,建議客戶端編程遵循;
>[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、版權信息
- 平臺版權
- 產品版權
- 后記