这个就是签名验证失败,也就是签名生成的某一个参数 搞错了
我这里是使用语音转文本接口,
文档中有demo示例
image.png
这里有几个重要的字段说明
X-TC-Version: 2019-06-14, //例子里面就是要求填2019-06-14,所以这里不需要修改
X-TC-Region: ap-guangzhou // 你的云主机位置,如果你是前端人员,可以咨询是谁创建的云主机,然后查看云主机的位置
X-TC-Action: CreateRecTask // 这个是语音识别固定的值,后面签名也需要用到
X-TC-Timestamp: 1599142560 // 时间戳
// 注意,这里有两个字段需要和签名一致 X-TC-Action和X-TC-Timestamp,因为签名是最后一步生成,可以把这两个参数传入生成签名的方法
我的云主机位于广州
image.png
下面最重要的就是生成签名了
如果你遇到我说的报错,很大概率肯定你是直接拿官方给的签名方法,拷贝过来了,因为我就是这样,哈哈
其实拷贝过来,修改一些需要修改的参数是没问题的,因为签名太过于繁琐,
我是flutter开发,下面,我只贴重要的代码,因为签名等信息放在请求头,下面是生成请求头的方法
static headers(String payload,String action) {
final timestamp = (DateTime.now().millisecondsSinceEpoch / 1000).toInt();
final date = DateFormat('yyyy-MM-dd').format(
DateTime.fromMillisecondsSinceEpoch(timestamp * 1000, isUtc: true));
final _signature = signature(timestamp, date, payload,action);
// print("_signature: ${_signature}");
Map<String, dynamic> headers = {
"Content-Type": "application/json",
"X-TC-Version": "2019-06-14",
"X-TC-Region": "ap-guangzhou",
"X-TC-Action": action,
"X-TC-Timestamp": '${timestamp}',
"Authorization":
"TC3-HMAC-SHA256 Credential=${secretID}/${date}/asr/tc3_request, SignedHeaders=content-type;host;x-tc-action, Signature=${_signature}"
};
// print("headers:${headers.toString()}");
return headers;
}
这里有哥注意的点,下面来自文档说明,就是date要以UTC+0为准,
image.png
不知道你注意到没有,生成请求头方法,我为何要把请求的参数和action传入进来???
这就是我遇到的问题了,官方生成签名的demo中有一个变量如下
final payload = '{"Limit": 1, "Filters": [{"Values": ["未命名"], "Name": "instance-name"}]}';
一开始我没有注意,感觉用官方的应该也没问题,就啥也不改,然后一直报错
后面我百度了好久,也没有找到问题,好吧,去阅读文档,如下图
image.png
生成签名时需要把请求参数加入进来,也就是我刚说的final payload = '{"Limit": 1, "Filters": [{"Values": ["未命名"], "Name": "instance-name"}]}';
这个payload就是你的请求参数
而aciton是用来区分不同的请求的,后面其他请求,主要传入对应action即可
做完这一步,请求终于成功了