通过ak/sk认证的方式访问在线服务-九游平台
如果在线服务的状态处于“运行中”,则表示在线服务已部署成功。部署成功的在线服务,将为用户提供一个可调用的api,此api为标准restful api。用户可以通过ak/sk签名认证方式调用api。
使用ak/sk认证时,您可以通过apig sdk访问,也可以通过modelarts sdk访问。使用modelarts sdk访问参见用户ak-sk认证模式。本文档详细介绍如何通过apig sdk访问在线服务,具体操作流程如下:

- ak/sk签名认证方式,仅支持body体12m以内,12m以上的请求,需使用token认证。
- 客户端须注意本地时间与时钟服务器的同步,避免请求消息头x-sdk-date的值出现较大误差。因为api网关除了校验时间格式外,还会校验该时间值与网关收到请求的时间差,如果时间差超过15分钟,api网关将拒绝请求。
约束限制
- 请求体的大小不超过12mb,超过后请求会被拦截。
- 因apig(api网关)限制,平台每次请求预测的时间不超过40秒。
获取ak/sk
如果已生成过ak/sk,则可跳过此步骤,找到原来已下载的ak/sk文件,文件名一般为:credentials.csv。
如下图所示,文件包含了租户名(user name),ak(access key id),sk(secret access key)。

- 注册并登录管理控制台。
- 单击右上角的用户名,在下拉列表中单击“我的凭证”。
- 单击“访问密钥”。
- 单击“新增访问密钥”,进入“身份验证”页面。
- 根据提示完成身份验证,下载密钥,并妥善保管。
获取在线服务信息
在调用接口时,需获取在线服务的调用地址,以及在线服务的输入参数信息。步骤如下:
- 登录modelarts管理控制台,在左侧导航栏中选择“模型部署 > 在线服务”,默认进入“在线服务”列表。
- 单击目标服务名称,进入服务详情页面。
- 在“在线服务”的详情页面,可以获取该服务的调用地址和输入参数信息。
“api接口公网地址”即在线服务的调用地址。当模型配置文件中apis定义了路径,调用地址后需拼接自定义路径。如:“{在线服务的调用地址}/predictions/poetry”。图2 获取在线服务api接口地址和文件预测输入参数信息
方式一:使用python语言发送预测请求
- 下载python sdk并在开发工具中完成sdk配置。具体操作请参见在python环境中集成api请求签名的sdk。
- 创建请求体,进行预测请求。
- 输入为文件格式
# coding=utf-8 import requests import os from apig_sdk import signer if __name__ == '__main__': # config url, ak, sk and file path. url = "在线服务的调用地址" # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_sdk_ak和huaweicloud_sdk_sk。 ak = os.environ["huaweicloud_sdk_ak"] sk = os.environ["huaweicloud_sdk_sk"] file_path = "预测文件的本地路径" # create request, set method, url, headers and body. method = 'post' headers = {"x-sdk-content-sha256": "unsigned-payload"} request = signer.httprequest(method, url, headers) # create sign, set the ak/sk to sign and authenticate the request. sig = signer.signer() sig.key = ak sig.secret = sk sig.sign(request) # send request files = {'images': open(file_path, 'rb')} resp = requests.request(request.method, request.scheme "://" request.host request.uri, headers=request.headers, files=files) # print result print(resp.status_code) print(resp.text)
“file_path”为预测文件的本地路径,既可使用绝对路径(如windows格式"d:/test.png",linux格式"/opt/data/test.png"),也可以使用相对路径(如"./test.png")。
“files”参数的请求体样式为“files={"请求参数":("文件路径",文件内容,“文件类型”)}”,参数填写可以参考表1。表1 files参数说明 参数
是否必填
说明
请求参数
是
在线服务输入参数名称。
文件路径
否
上传文件的路径。
文件内容
是
上传文件的内容。
文件类型
否
上传文件类型。当前支持以下类型:
- txt类型:text/plain
- jpg/jpeg类型:image/jpeg
- png类型:image/png
- 输入为文本格式(json类型)
读取本地预测文件并进行base64编码的请求体示例如下:
# coding=utf-8 import base64 import json import os import requests from apig_sdk import signer if __name__ == '__main__': # config url, ak, sk and file path. url = "在线服务的调用地址" # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_sdk_ak和huaweicloud_sdk_sk。 ak = os.environ["huaweicloud_sdk_ak"] sk = os.environ["huaweicloud_sdk_sk"] file_path = "预测文件的本地路径" with open(file_path, "rb") as file: base64_data = base64.b64encode(file.read()).decode("utf-8") # create request, set method, url, headers and body. method = 'post' headers = { 'content-type': 'application/json' } body = { 'image': base64_data } request = signer.httprequest(method, url, headers, json.dumps(body)) # create sign, set the ak/sk to sign and authenticate the request. sig = signer.signer() sig.key = ak sig.secret = sk sig.sign(request) # send request resp = requests.request(request.method, request.scheme "://" request.host request.uri, headers=request.headers, data=request.body) # print result print(resp.status_code) print(resp.text)
“body”中的参数名由在线服务的输入参数决定,需要和“类型”为“string”的输入参数“名称”保持一致。此处以“image”为例。“body”中的base64_data值为string类型。
- 输入为文件格式
方式二:使用java语言发送预测请求
- 下载java sdk并在开发工具中完成sdk配置。具体操作请参见在java环境中集成api请求签名的sdk
- 创建java类,进行预测请求。
由于在apig的java sdk中,“request.setbody()”只支持string类型,所以只支持输入为文本格式的预测请求。如果输入的是文件格式,需要先进行base64编码转换成文本。
- 输入为文件格式
此处以json格式为例介绍读取本地预测文件并进行base64编码的请求体,请求体示例如下:
package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.client; import com.cloud.apigateway.sdk.utils.request; import org.apache.commons.codec.binary.base64; import org.apache.http.httpheaders; import org.apache.http.client.methods.closeablehttpresponse; import org.apache.http.client.methods.httppost; import org.apache.http.client.methods.httprequestbase; import org.apache.http.impl.client.httpclients; import org.apache.http.util.entityutils; import java.io.fileinputstream; import java.io.ioexception; import java.io.inputstream; public class myaksktest2 { public static void main(string[] args) { string url = "在线服务的调用地址"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_sdk_ak和huaweicloud_sdk_sk。 string ak = system.getenv("huaweicloud_sdk_ak"); string sk = system.getenv("huaweicloud_sdk_sk"); string filepath = "预测文件的本地路径"; try { // create request request request = new request(); // set the ak/sk to sign and authenticate the request. request.setkey(ak); request.setsecret(sk); // specify a request method, such as get, put, post, delete, head, and patch. request.setmethod(httppost.method_name); // add header parameters request.addheader(httpheaders.content_type, "application/json"); // set a request url in the format of https://{endpoint}/{uri}. request.set; // build your json body string body = "{\"image\":\"" getbase64fromfile(filepath) "\"}"; // special characters, such as the double quotation mark ("), contained in the body must be escaped. request.setbody(body); // sign the request. httprequestbase signedrequest = client.sign(request); // send request. closeablehttpresponse response = httpclients.createdefault().execute(signedrequest); // print result system.out.println(response.getstatusline().getstatuscode()); system.out.println(entityutils.tostring(response.getentity())); } catch (exception e) { e.printstacktrace(); } } /** * convert the file into a byte array and base64 encode it * @return */ private static string getbase64fromfile(string filepath) { // convert the file into a byte array inputstream in = null; byte[] data = null; try { in = new fileinputstream(filepath); data = new byte[in.available()]; in.read(data); in.close(); } catch (ioexception e) { e.printstacktrace(); } // base64 encode return new string(base64.encodebase64(data)); } }
使用base64编码方式,需要在模型推理代码中增加对请求体解码的代码。
- 输入为文本格式(json类型)
// package name of the demo. package com.apig.sdk.demo; import com.cloud.apigateway.sdk.utils.client; import com.cloud.apigateway.sdk.utils.request; import org.apache.http.httpheaders; import org.apache.http.client.methods.closeablehttpresponse; import org.apache.http.client.methods.httppost; import org.apache.http.client.methods.httprequestbase; import org.apache.http.impl.client.httpclients; import org.apache.http.util.entityutils; public class myaksktest { public static void main(string[] args) { string url = "在线服务的调用地址"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量huaweicloud_sdk_ak和huaweicloud_sdk_sk。 string ak = system.getenv("huaweicloud_sdk_ak"); string sk = system.getenv("huaweicloud_sdk_sk"); try { // create request request request = new request(); // set the ak/sk to sign and authenticate the request. request.setkey(ak); request.setsecret(sk); // specify a request method, such as get, put, post, delete, head, and patch. request.setmethod(httppost.method_name); // add header parameters request.addheader(httpheaders.content_type, "application/json"); // set a request url in the format of https://{endpoint}/{uri}. request.set; // special characters, such as the double quotation mark ("), contained in the body must be escaped. string body = "{}"; request.setbody(body); // sign the request. httprequestbase signedrequest = client.sign(request); // send request. closeablehttpresponse response = httpclients.createdefault().execute(signedrequest); // print result system.out.println(response.getstatusline().getstatuscode()); system.out.println(entityutils.tostring(response.getentity())); } catch (exception e) { e.printstacktrace(); } } }
“body”由具体文本格式决定,此处以json为例。
- 输入为文件格式
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨