如何获取某个开放平台API的请求参数和返回参数的参数名称、参数类型?原创
金蝶云社区-吴锐雄
吴锐雄
1人赞赏了该文章 386次浏览 未经作者许可,禁止转载编辑于2023年08月10日 18:05:55

关键词:快捷键,单据体,复制,焦点

一、需求

如图,以下是一个苍穹预置的人员查询API,本案例讲述如何获取获取人员API的请求参数和返回参数的 参数名称,参数类型,是否多选,是否必填等信息。

摘要认证的方式进行获取。

image.png


二、思路与方案

1.API管理列表对应的基础资料是“API服务”,标识是openapi_apilist。我们可以在API管理中添加一个业务对象为API服务”的API操作服务,提供给第三方系统调用。

2.摘要认证,需要在第三方应用开启摘要认证功能。然后在第三方系统调用时,构建摘要信息,仅发出一次http请求,即可完成调用。


三、实现过程

1.配置api

新增操作服务

image.png


选择业务对象,选择API服务”,标识是openapi_apilist。

image.png


填写一些关键信息,api编码、名称、请求方式、操作方式等等。

image.png


添加请求参数,准备用 编码number、名称name作为查询条件,因此,需要添加这两个字段为请求参数。

image.png


参数控制,构建查询条件,“比较方式”使用等于,比较变量是 字段本身。

image.png


添加返回参数,勾选单据头的一些参数。

image.png


勾选 分录“请求体”的本身以及他的一些字段。

image.png


勾选分录“返回参数”的本身以及他的一些字段。

image.png


至此,api已经配置完成。


2.创建第三方应用,开启摘要认证

image.png


开启摘要认证,复制“认证密钥”,这个认证密钥将在之后的调用api时,会用到。

image.png


在工程项目中,新建一个文件,把刚刚复制的摘要的认证密钥保存进去。

image.png


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("&timestamp=" + timeStamp);
   stringBuilder.append("&signatureNonce=" + uuid);
   stringBuilder.append("&signature=" + signatureString);
   stringBuilder.append("&parameters=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;
}


四,效果图

image.png


可以看到终端中输出了相关的api信息

image.png

对比下图中,上图中的json字符串,返回了“工号查询人员信息”这个接口的一些信息。

image.png


五、开发环境版本

苍穹5.0.011


六、参考资料

OPENAPI开发认证指南




get_api.zip(5.10KB)

赞 1