访问入口及协议
域名
每个API服务都属于一个API分组,每个API分组有不同的域名。域名是由服务端绑定的独立域名,API网关通过域名来寻址定位API分组。 域名的格式为 www.[独立域名].com/[Path]?[HTTPMethod],在公测阶段,API使用者需要在线下从API提供者处获取此域名。 云API网关通过域名定位到一个唯一的分组,通过Path+HTTPMethod确定该分组下唯一的API。 您需要在线下从API服务商处获取API文档,其中会包含域名、Path等必要参数信息。
系统级Header
【必选】X-Ca-Key:API调用者传递AppKey 【必选】X-Ca-Signature:API加签签名 【可选】X-Ca-Timestamp:API调用者传递时间戳,为时间转换为毫秒的值,也就是从1970年1月1日起至今的时间转换为毫秒,可选,默认15分钟内有效 【可选】X-Ca-Nonce:API调用者自定义请求UUID,结合时间戳防重放,可选,使用时需要配合时间戳 【可选】Content-MD5当请求Body为Stream时,可以计算Body的MD5值传递给云网关校验 【可选】X-Ca-Stage请求API所属Stage,目前仅支持test和release,如果不传递,默认release。
签名校验
组织参与签名计算的字符串
String stringToSign=
HTTPMethod + "\n" +
Accept + "\n" +
Content-MD5 + "\n"
Content-Type + "\n" +
Date + "\n" +
Headers + "\n" +
Url + "\n"
说明
HTTPMethod为全大写
Accept、Content-MD5、Content-Type、Date、Headers、Url、如果为空也需要添加换行符"\n"
Content-MD5
Content-MD5是指Body的MD5值,只有当Body为Stream时才计算MD5,计算方式为:
String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));
Headers
Headers指所有参与签名计算的Header的Key、Value,这里要注意参与签名计算的Header是不包含X-Ca-Signature、X-Ca-Signature-Headers的。
Headers组织方法:
先对所有参与签名计算的Header的Key按照字典排序,然后按照如下方式拼接:
String headers =
HeaderKey1 + ":" + HeaderValue1 + "\n"\+
HeaderKey2 + ":" + HeaderValue2 + "\n"\+
...
HeaderKeyN + ":" + HeaderValueN + "\n"
Url
Url指Path + Query + Body中Form参数,组织方法:
对Query+Form参数按照字典对Key进行排序后按照如下方法拼接,如果Query或Form参数为空,则Uri = Path,不需要添加"?" \
String url =
Path +
"?" +
Key1 + "=" + Value1 +
"&" + Key2 + "=" + Value2 +
...
"&" + KeyN + "=" + ValueN
注意这里Query或Form参数的Value可能有多个,多个的时候只取第一个Value参与签名计算
计算签名
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));
secret是您创建的APP的AppSecret
传递签名
将计算的签名放到Request的Header中,Key为:X-Ca-Signature
将所有参与加签的Header的Key使用应为逗号分割放到Request的Header中,Key为:X-Ca-Signature-Headers
时间戳校验
Content-MD5
Content-MD5是指Body的MD5值,只有当Body为Stream时才计算MD5,计算方式为:
String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));