关键词:快捷键,单据体,复制,焦点
一、需求
如图,以下是一个苍穹预置的人员查询API,本案例讲述如何获取获取人员API的请求参数和返回参数的 参数名称,参数类型,是否多选,是否必填等信息。
用摘要认证的方式进行获取。
二、思路与方案
1.API管理列表对应的基础资料是“API服务”,标识是openapi_apilist。我们可以在API管理中添加一个业务对象为“API服务”的API操作服务,提供给第三方系统调用。
2.摘要认证,需要在第三方应用开启摘要认证功能。然后在第三方系统调用时,构建摘要信息,仅发出一次http请求,即可完成调用。
三、实现过程
1.配置api
新增操作服务
选择业务对象,选择“API服务”,标识是openapi_apilist。
填写一些关键信息,api编码、名称、请求方式、操作方式等等。
添加请求参数,准备用 编码number、名称name作为查询条件,因此,需要添加这两个字段为请求参数。
参数控制,构建查询条件,“比较方式”使用等于,比较变量是 字段本身。
添加返回参数,勾选单据头的一些参数。
勾选 分录“请求体”的本身以及他的一些字段。
勾选分录“返回参数”的本身以及他的一些字段。
至此,api已经配置完成。
2.创建第三方应用,开启摘要认证
开启摘要认证,复制“认证密钥”,这个认证密钥将在之后的调用api时,会用到。
在工程项目中,新建一个文件,把刚刚复制的摘要的认证密钥保存进去。
3.构建摘要信息,对API进行请求
在主函数中构建请求参数,发送get请求。
public static String SIGNATUR_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static String COSMIC_API_HOST = "http://172.20.14.63:8085/ierp/kapi/v2/kdec/open/openapi_apilist/wrx_getapi_info" ; public static void main(String[] args) throws Exception { // 获取摘要认证密钥 String appSecret = new LoadFileUtil().getAppSecretFromLocal("./asfile"); // 构建将被加密的部分请求参数 String pram = "number=queryByNumber&name=工号查询人员信息&pageSize=10&pageNo=1"; String timeStamp = new SimpleDateFormat(SIGNATUR_TIME_FORMAT).format(new Date()); String uuid = UUID.randomUUID().toString(); String signatureString = getDigest(appSecret, pram, timeStamp, uuid); StringBuilder stringBuilder = new StringBuilder(COSMIC_API_HOST); stringBuilder.append("?" + pram); stringBuilder.append("&appId=wrxtest_digest"); stringBuilder.append("×tamp=" + timeStamp); stringBuilder.append("&signatureNonce=" + uuid); stringBuilder.append("&signature=" + signatureString); stringBuilder.append("¶meters=number,name,pageSize,pageNo"); stringBuilder.append("&user=13766666666"); stringBuilder.append("&usertype=Mobile"); stringBuilder.append("&accountId=1637539188922384384"); String strResponse = requestGetUrl(stringBuilder.toString()); System.out.println( "Response: " + strResponse); }
对上述代码的一些请求参数进行说明:
1.appSecret从项目文件中取出,是摘要的认证密钥,做为SHA256的key。密钥不建议在代码中使用硬编码保存,所以我新建了一个文件保存起来。还有更加安全的保存密钥方式,请开发者自行探索,这里不再赘述。
2.pram变量里面包含了数个参数,这些参数是要与 时间戳timeStamp、随机字符串uuid共同作为SHA256的data进行加密的。
3.parameters,在加密过程中用了哪些参数,即pram变量里面的那些参数,以逗号隔开。上述代码中,我用了number,name,pageSize,pageNo作为data去加密。
4.user是用户手机号,usertype固定填Mobile,accountId是数据中心id,这些都是调用open api的固定参数。
使用密钥加密
private static String getDigest (String appSecret, String pram, String timeStamp, String uuid) throws Exception { StringBuilder stringBuilder = new StringBuilder(pram); StringBuilder signBuilder = getSignatureString(timeStamp,uuid,stringBuilder.toString()); String signatureString = HMACSHA256StrByKey(signBuilder.toString(), appSecret); return signatureString; } public static StringBuilder getSignatureString(String datetimeString, String signatureNonce, String body) { StringBuilder sb = new StringBuilder(); sb.append(body); sb.append(datetimeString); sb.append(signatureNonce); return sb; } public static String HMACSHA256StrByKey(String data, String key) throws Exception { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte item : array) sb.append(Integer.toHexString(item & 0xFF | 0x100).substring(1, 3)); return sb.toString(); }
http请求方法,使用okhttp框架进行请求。
private static String requestGetUrl(String url) { Request request = new Request.Builder() .url(url) .build(); OkHttpClient okHttpClient = new OkHttpClient(); Call call = okHttpClient.newCall(request); try { Response response = call.execute(); String strResponse = response.body().string(); return strResponse; } catch (IOException e) { e.printStackTrace(); } return null; }
四,效果图
可以看到终端中输出了相关的api信息
对比下图中,上图中的json字符串,返回了“工号查询人员信息”这个接口的一些信息。
五、开发环境版本
苍穹5.0.011
六、参考资料
get_api.zip(5.10KB)
推荐阅读