视觉智能开放平台的API接口推荐使用SDK进行调用,推荐在服务端进行接入,在客户端直接接入AccessKey ID和AccessKey Secret有泄漏风险,可以使用STS授权用户调用服务。
背景信息
在进行Web调用之前,需要使用STS服务获取临时访问凭证。阿里云STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务。您可以通过STS服务给其他用户颁发临时访问凭证,该用户可使用临时访问凭证,在规定时间内调用视觉智能开放平台的各项服务。临时访问凭证无需透露您的长期密钥,保障您的账户更加安全。获取临时访问凭证,请参见获取角色的临时身份凭证。
若文件存放在上海OSS中:
如果您的文件存放在上海OSS(阿里云对象存储 Object Storage Service)中,则需要使用请求签名机制进行调用。有关具体的调用方式,请参见方案一:若文件在上海地域OSS。对于OSS的具体操作,请参见开通OSS服务。
若文件在本地文件或者其他链接:
若是涉及其他情况(如本地文件或者其他链接),您需要先将文件链接转换成上海OSS链接,具体操作,请参见文件URL处理。有关具体的调用方式,请参见方案二:若文件在本地或可访问的URL。
阿里云视觉智能开放平台各类目视觉AI能力API接入、接口使用或问题咨询等,请通过钉钉群(23109592)加入阿里云视觉智能开放平台咨询群联系我们。
方案一:若文件在上海地域OSS
若您的文件存放在上海OSS中,可以参见请求签名的方式进行调用,本文以银行卡识别(RecognizeBankCard)为例,仅展示关键步骤及关键代码,完整的示例可下载WebDemo。如果您需要调用其他算法,请参见注释并根据实际业务修改相应的代码。
交互流程
前提条件
获取STS临时凭证:
授予权限:
在获取STS临时凭证之前,调用者(RAM用户和RAM角色)需要被授权有调用STS接口的权限。您可以通过设置RAM权限策略来实现这一点。相关的设置步骤和权限策略可参见使用STS临时访问凭证访问OSS文档。您需要根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。关于更细粒度的授权策略配置详情,请参见视觉智能开放平台自定义权限策略参考。
重要为后续步骤进行,调用者(RAM用户和RAM角色)需要被授权AliyunSTSAssumeRoleAccess(调用STS服务AssumeRole接口的权限)、AliyunVIAPIFullAccess(这里为了下列实例,给出的是管理视觉智能API的权限,但是在实际工作中,强烈建议您根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。关于更细粒度的授权策略配置详情,请参见视觉智能开放平台自定义权限策略参考)。
调用AssumeRole接口:
使用已授权的RAM用户或RAM角色调用AssumeRole接口,并按照接口文档填写必要参数。查阅AssumeRole接口的官方文档以了解详细的接口说明和使用方法。
使用STS Token:
调用AssumeRole接口成功后,您会收到一个包含
AccessKeyId
、AccessKeySecret
和SecurityToken
的STS Token(如下代码)。在实际调用其他阿里云服务的接口时,您需要将代码中的<ALIBABA_CLOUD_ACCESS_KEY_ID>
、<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
、<ALIBABA_CLOUD_SECURITY_TOKEN>
替换为阿里云STS Token数据中获取的临时AccessKeyId
、AccessKeySecret
、SecurityToken
。
{
"RequestId": "429D9967-C809-5A30-B65E-9B742CF*****",
"AssumedRoleUser": {
"Arn": "acs:ram::175805416243****:role/STStokenTestRole/STSsessionName",
"AssumedRoleId": "39779315882322****:STSsessionName"
},
"Credentials": {
"SecurityToken": "exampleToken",
"AccessKeyId": "STS.exampleAccessKeyID",
"AccessKeySecret": "exampleAccessKeySecret",
"Expiration": "2024-06-12T03:21:29Z"
}
}
步骤一:配置基本参数
下面提供的代码段是调用阿里云的“银行卡识别”服务,在WebDemo的js/script.js文件中。
准备API调用的参数:
AccessKeyId、AccessKeySecret、SecurityToken:首先,你需要替换
<ALIBABA_CLOUD_ACCESS_KEY_ID>
、<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
、<ALIBABA_CLOUD_SECURITY_TOKEN>
这三个变量为你通过用前提条件中获取的STS Token的临时访问密钥和安全令牌。Endpoint:API的访问域名,这里为
ocr.cn-shanghai.aliyuncs.com
。Action:API操作名称,这里为
RecognizeBankCard
,表示调用的是银行卡识别服务。API Version:API版本,这里为
2019-12-30
。特别注意要授予权限给RAM用户或角色,以确保有权限调用视觉智能开放平台的API。请参见前提条件中的授予权限。
构造请求参数对象:
request_
对象包含了API调用所需的系统参数(如签名方法、时间戳、格式等)和业务参数(这里是待识别的银行卡图片URLImageURL
)。发起API请求:
通过调用封装好的
callApiRequest
函数,将准备好的请求参数、HTTP请求方法、API endpoint、STS Token的AccessKeySecret以及一个回调函数传递进去。回调函数用于处理API响应。
举例来说,如果您希望使用通用分割能力,通过通用分割API文档得知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage。此时,您需要将endpoint
改为imageseg.cn-shanghai.aliyuncs.com
,Action
改为SegmentCommonImage
,API_VERSION
保持为2019-12-30
不需要修改,request_["ImageURL"]
参数名保持为ImageURL
不需要修改。在获取结果的时候,需要注意获取的是ImageURL
,其含义不是银行卡号,而是分割后的图片地址。
在运行代码之前,计算签名需要引入CryptoJS的包,具体信息请参见CryptoJS包下载地址和CDN地址。有关计算签名的具体逻辑,请参见请求签名的相关内容。
/**
* ========================================================================================================================
* 以RecognizeBankCard为例。
* 代码中的<ALIBABA_CLOUD_ACCESS_KEY_ID>、<ALIBABA_CLOUD_ACCESS_KEY_SECRET>、<ALIBABA_CLOUD_SECURITY_TOKEN>需替换为阿里云STS Token数据中获取的临时AccessKeyId、AccessKeySecret、SecurityToken
* 请求银行卡识别:https://help.aliyun.com/document_detail/151893.html
* ========================================================================================================================
*/
function callRecognizeBankCard(callback) {
/**
<ALIBABA_CLOUD_ACCESS_KEY_ID>、<ALIBABA_CLOUD_ACCESS_KEY_SECRET>、<ALIBABA_CLOUD_SECURITY_TOKEN>需替换为STS Token数据中获取的临时AccessKeyId、AccessKeySecret、SecurityToken
需要为RAM用户和RAM角色授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
*/
//AccessKeyID
const accessKeyId = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
//AccessKeySecret
const accessKeySecret = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
//SecurityToken
const securityToken = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
// 这里endpoint为API访问域名,与类目相关,具体类目的API访问域名请参考:https://help.aliyun.com/document_detail/143103.html
const endpoint = "ocr.cn-shanghai.aliyuncs.com";
// API Action,能力名称,请参考具体算法文档详情页中的Action参数,这里以银行卡识别为例:https://help.aliyun.com/document_detail/151893.html
const Action = "RecognizeBankCard";
// API_HTTP_METHOD推荐使用POST
const API_HTTP_METHOD = "POST";
// API_VERSION为API版本,与类目相关,具体类目的API版本请参考:https://help.aliyun.com/document_detail/464194.html
const API_VERSION = "2019-12-30";
const request_ = {};
//系统参数
request_["SignatureMethod"] = "HMAC-SHA1";
request_["SignatureNonce"] = signNRandom();
request_["AccessKeyId"] = accessKeyId;
request_["SignatureVersion"] = "1.0";
request_["Timestamp"] = getTimestamp();
request_["Format"] = "JSON";
request_["RegionId"] = "cn-shanghai";
request_["Version"] = API_VERSION;
request_["Action"] = Action;
request_["SecurityToken"] = securityToken;
// 业务参数,请参考具体的AI能力的API文档进行修改
request_["ImageURL"] = "http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk3.jpg";
callApiRequest(request_, API_HTTP_METHOD, endpoint, accessKeySecret, callback);
}
步骤二:调用服务端接口并计算签名
下面提供的代码段是针对视觉智能开放平台API的签名和请求发送过程的实现。签名是云服务常用的一种安全措施,用于确保发送到云服务的请求是未经篡改的,并且是由拥有相应凭证的合法用户发起的。具体逻辑文档请参见文档请求签名。
以下是该代码段的具体含义和步骤:
签名步骤:
生成随机数字(Nonce):函数
signNRandom
生成一个随机数,这是为了使得每个请求都是唯一的,以防止重放攻击。获取时间戳:函数
getTimestamp
生成符合ISO 8601标准的时间戳,表示请求发送的时间。参数排序:函数
ksort
按照字典序排序所有请求参数。这是因为签名算法要求参数必须以确定的顺序进行排列。计算签名:函数
createHmac
和getSignature
结合使用,用提供的Access Key Secret和以上生成的规范请求字符串,采用HMAC-SHA1算法计算出请求的签名。构建请求URL:函数
generateUrl
构建完整的请求URL,包括所有排序后的请求参数和计算得到的签名。
发送请求步骤:
发送请求:函数
callApiRequest
使用上述构建的URL通过http.post
函数发送一个HTTP POST请求。处理响应:当服务器响应请求后,回调函数会被调用,并处理返回的结果,如将响应的JSON文本转换成对象。
步骤三:封装请求并发送数据至指定视觉智能开放平台API
下面提供的代码段是在Web前端环境中用于封装HTTP请求和发送数据到指定API的示例实现。提供了在Web前端调用API的封装方法,通过定义请求参数和设置回调方式来简化异步HTTP请求的处理。它提供了基本的错误处理(如超时)和简化了通过POST方法发送JSON数据的过程。
以下是该代码段的具体含义和步骤:
构建HTTP库:创建一个包含所有HTTP请求方法的
http
对象。实现基本请求方法:通过
http.request
函数,使用XMLHttpRequest
来实现对基本HTTP请求的支持。封装特定类型请求:提供
http.post
方法,简化使用JSON格式发送POST请求的过程。发起请求并处理结果:通过
callApiRequest
函数,展示如何使用封装的HTTP库发送请求并处理响应。
步骤四:页面触发按钮并调用视觉智能开放平台API
页面触发按钮,调用API(银行卡识别功能)。以下是该代码段的具体含义和步骤:
用户点击按钮:触发
callRecognizeBankCard
函数。执行银行卡识别操作:通过
callRecognizeBankCard
函数向后端发送请求,进行银行卡信息的识别。处理识别结果:
错误处理:根据错误码(
Code
)显示不同的错误信息。成功处理:在成功识别出银行卡信息后,显示银行卡号(
CardNumber
)。
方案二:若文件在本地或可访问的URL
若您的文件存放在本地或可访问的URL,请参见文件URL处理,显式地将文件转换成上海OSS链接,再按照若文件在上海地域OSS进行调用。本文以银行卡识别(RecognizeBankCard)为例,仅展示关键步骤及关键代码,完整的示例可下载WebDemo。如果您调用其他算法,请参见注释和实际业务修改相应代码。
交互流程
前提条件
获取STS临时凭证:
授予权限:
在获取STS临时凭证之前,调用者(RAM用户和RAM角色)需要被授权有调用STS接口的权限。您可以通过设置RAM权限策略来实现这一点。相关的设置步骤可参见使用STS临时访问凭证访问OSS文档。您需要根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。关于更细粒度的授权策略配置详情,请参见视觉智能开放平台自定义权限策略参考。
重要为后续步骤进行,调用者(RAM用户和RAM角色)需要被授权AliyunSTSAssumeRoleAccess(调用STS服务AssumeRole接口的权限)、RAM角色授予上传OSS文件的权限、AliyunVIAPIFullAccess(这里为了下列实例,给出的是管理视觉智能API的权限,您需要根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。关于更细粒度的授权策略配置详情,请参见视觉智能开放平台自定义权限策略参考)
调用AssumeRole接口:
使用已授权的RAM用户或RAM角色调用AssumeRole接口,并按照接口文档填写必要参数。查阅AssumeRole接口的官方文档以了解详细的接口说明和使用方法。
使用STS Token:
调用AssumeRole接口成功后,您会收到一个包含AccessKeyId、AccessKeySecret和SecurityToken的STS Token(如下代码)。在实际调用其他阿里云服务的接口时,您需要将代码中的
<ALIBABA_CLOUD_ACCESS_KEY_ID>、<ALIBABA_CLOUD_ACCESS_KEY_SECRET>、<ALIBABA_CLOUD_SECURITY_TOKEN>
替换为阿里云STS Token数据中获取的临时AccessKeyId、AccessKeySecret、SecurityToken
。
{
"RequestId": "429D9967-C809-5A30-B65E-9B742CF*****",
"AssumedRoleUser": {
"Arn": "acs:ram::175805416243****:role/STStokenTestRole/STSsessionName",
"AssumedRoleId": "39779315882322****:STSsessionName"
},
"Credentials": {
"SecurityToken": "exampleToken",
"AccessKeyId": "STS.exampleAccessKeyID",
"AccessKeySecret": "exampleAccessKeySecret",
"Expiration": "2024-06-12T03:21:29Z"
}
}
步骤一:配置基本参数
下面提供的代码段是调用阿里云的"银行卡识别"服务,在WebDemo的js/script.js文件中。需要将代码中的<ALIBABA_CLOUD_ACCESS_KEY_ID>、<ALIBABA_CLOUD_ACCESS_KEY_SECRET>、<ALIBABA_CLOUD_SECURITY_TOKEN>
替换为阿里云STS Token数据中获取的临时AccessKeyId、AccessKeySecret、SecurityToken
。
此处的临时的AccessKeyId、AccessKeySecret、SecurityToken是为了避免暴露自己的AccessKeyId和AccessKeySecret在前端界面上。下面(步骤二)获取的STS Token临时访问权限是为了将上传文件到临时OSS bucket,从而得到RL地址。
/**
* 如何获取阿里云STS,请参考https://help.aliyun.com/zh/oss/developer-reference/use-temporary-access-credentials-provided-by-sts-to-access-oss
* <ALIBABA_CLOUD_ACCESS_KEY_ID>、<ALIBABA_CLOUD_ACCESS_KEY_SECRET>、<ALIBABA_CLOUD_SECURITY_TOKEN>需替换为阿里云STS Token数据中获取的临时AccessKeyId、AccessKeySecret、SecurityToken
* 需要为RAM用户和RAM角色授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
*/
//AccessKeyID
const accessKeyId = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
//AccessKeySecret
const accessKeySecret = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
//SecurityToken
const securityToken = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
步骤二:调用GetOssStsToken接口获取临时OSS STS Token
下面提供的代码段中getOssStsToken 函数用于获取OSS(Object Storage Service,对象存储服务)的STS(Security Token Service,安全令牌服务)令牌。它用于向阿里云请求临时访问权限以便上传文件到OSS。上传的文件会在OSS bucket中保存1天。通过指定的endpoint
(API访问域名),Action
(请求执行的操作名称),和API_VERSION
(API版本)来构造请求,然后通过回调函数callback
返回结果。callApi 函数用于调用阿里云平台的任意API,支持通过签名进行请求认证。函数接收endpoint
(API访问域名),action
(API操作名称),version
(API版本),可选的业务参数params
以及回调函数callback
。函数中构造了一个符合要求的请求对象request_
,包括系统参数(如签名方法、时间戳、访问密钥ID等)和业务参数。signNRandom
函数(未提供实现)生成一个唯一的随机值(SignatureNonce
)用于签名防重放,getTimestamp
函数(未提供实现)则提供当前时间戳。最后,该函数通过调用callApiRequest
(未提供实现)函数实现实际的API调用并通过callback
返回结果。
更多关于本步骤的原理详情,请参见文件URL处理。
步骤三:使用临时OSS STS Token将文件上传到阿里云视觉智能开放平台官方OSS Bucket
下面提供的代码段是将文件或URL资源上传到阿里云Object Storage Service(OSS)的JavaScript实现,尤其是上传到视觉智能开放平台官方的临时存储Bucket中。上传的文件有效期为1天,这便于用户进行接口调试。
以下是该代码段的具体含义和步骤:
初始化OSS客户端:使用STS令牌初始化OSS客户端,并指定OSS的区域和Bucket。
生成文件路径:使用
getNonce
函数生成一个随机字符串作为文件名的一部分,确保上传路径的唯一性。上传文件:使用OSS客户端的
put
方法,将本地文件或从URL转换得到的File对象上传到OSS。说明OSS Bucket上传文件的路径是
accessKeyId/getNonce(6)/fileName
。文件路径中的
accessKeyId
是步骤一:配置基本参数中获取的<ALIBABA_CLOUD_ACCESS_KEY_ID>
。
处理响应:在上传完成后,通过回调函数返回上传结果。这通常包括新上传的文件URL,如果上传过程中出现异常,则打印错误信息。
本步骤需要引入oss-client-sdk,更多信息,请参见Browser.js。
步骤四:上传之后得到OSS的URL地址,调用视觉智能开放平台API
下面提供的代码段是用上传之后得到OSS的URL地址,调用视觉智能开放平台API。具体的操作步骤与若文件在上海地域OSS进行调用一致。且每一步代码都已封装好,完整的示例代码可下载WebDemo。
准备API调用的参数:
Endpoint:API的访问域名,这里为
ocr.cn-shanghai.aliyuncs.com
。Action:API操作名称,这里为
RecognizeBankCard
,表示调用的是银行卡识别服务。API Version:API版本,这里为
2019-12-30
。特别注意要授予权限给RAM用户或角色,以确保有权限调用视觉智能开放平台的API。请参见前提条件中的授予权限。
构造请求参数对象:
request_
对象包含了API调用所需的系统参数(如签名方法、时间戳、格式等)和业务参数(这里是待识别的银行卡图片URLImageURL
)。发起API请求:
通过调用封装好的
callApi
函数,将准备好的请求参数、API endpoint、以及一个回调函数传递进去。回调函数用于处理API响应。
在WebDemo的js/script.js文件中,callRecognizeBankCard
函数的endpoint、Action、API_VERSION
参数及request_["ImageURL"]
这一行代表业务参数。举例来说,如果您希望使用通用分割能力,通过通用分割API文档得知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage。此时,您需要将endpoint
改为imageseg.cn-shanghai.aliyuncs.com
,Action
改为SegmentCommonImage
,API_VERSION
保持为2019-12-30
不需要修改,request_["ImageURL"]
参数名保持为ImageURL
不需要修改。在获取结果的时候,需要注意获取的是ImageURL
,其含义不是银行卡号,而是分割后的图片地址。
/**
* ========================================================================================================================
* 以RecognizeBankCard为例。
* 请求银行卡识别:https://help.aliyun.com/document_detail/151893.html
* ========================================================================================================================
*/
function callRecognizeBankCard(imageUrl, callback) {
// 这里endpoint为API访问域名,与类目相关,具体类目的API访问域名请参考:https://help.aliyun.com/document_detail/143103.html
const endpoint = "ocr.cn-shanghai.aliyuncs.com";
// API Action,能力名称,请参考具体算法文档详情页中的Action参数,这里以银行卡识别为例:https://help.aliyun.com/document_detail/151893.html
const Action = "RecognizeBankCard";
// API_VERSION为API版本,与类目相关,具体类目的API版本请参考:https://help.aliyun.com/document_detail/464194.html
const API_VERSION = "2019-12-30";
const params = {};
// 业务参数,请参考具体的AI能力的API文档进行修改
params["ImageURL"] = imageUrl;
callApi(endpoint, Action, API_VERSION, params, callback);
}