华为云AI开发平台ModelArts访问在线服务(Token认证)_云淘科技

若在线服务的状态处于“运行中”,则表示在线服务已部署成功,部署成功的在线服务,将为用户提供一个可调用的API,此API为标准Restful API。在集成至生产环境之前,需要对此API进行调测,您可以使用以下方式向在线服务发起预测请求:

方式一:使用图形界面的软件进行预测(以Postman为例)。Windows系统建议使用Postman。
方式二:使用curl命令发送预测请求。Linux系统建议使用curl命令。
方式三:使用Python语言发送预测请求。
方式四:使用Java语言发送预测请求。

前提条件

已经获取用户Token预测文件的本地路径在线服务的调用地址在线服务的输入参数信息。

用户Token的获取请参见获取Token认证.。获取Token认证时,由于ModelArts生成的在线服务API不支持domain范围的token,因此需获取使用范围为project的Token信息,即scope参数的取值为project。
预测文件的本地路径既可使用绝对路径(如Windows格式”D:/test.png”,Linux格式”/opt/data/test.png”),也可以使用相对路径(如”./test.png”)。
在线服务的调用地址和输入参数信息,可以在控制台的“在线服务详情 > 调用指南”页面获取。

“API接口公网地址”即在线服务的调用地址。当模型配置文件中apis定义了路径,调用地址后需拼接自定义路径。如:“{在线服务的调用地址}/predictions/poetry”。

图1 获取在线服务AI接口地址和文件预测输入参数信息

图2 获取在线服务AI接口地址和文本预测输入参数信息

方式一:使用图形界面的软件进行预测(以Postman为例)

下载Postman软件并安装,您也可以直接在Chrome浏览器添加Postman扩展程序(也可使用其他支持发送post请求的软件)。Postman推荐使用7.24.0版本。
打开Postman,如图3所示。

图3 Postman界面

在Postman界面填写参数,以图像分类举例说明。

选择POST任务,将在线服务的调用地址复制到POST后面的方框。Headers页签的Key值填写为“X-Auth-Token”,Value值为用户Token。

您也可以通过AK(Access Key ID)/SK(Secret Access Key)加密调用请求,具体可参见用户AK-SK认证模式。

图4 参数填写

在Body页签,根据AI应用的输入参数不同,可分为2种类型:文件输入、文本输入。

文件输入

选择“form-data”。在“KEY”值填写AI应用的入参,和在线服务的输入参数对应,比如本例中预测图片的参数为“images”。然后在“VALUE”值,选择文件,上传一张待预测图片(当前仅支持单张图片预测),如图5所示。

图5 填写Body

文本输入

选择“raw”,选择JSON(application/json)类型,在下方文本框中填写请求体,请求体样例如下:

{
  "meta": {
    "uuid": "10eb0091-887f-4839-9929-cbc884f1e20e"
  },
  "data": {
    "req_data": [
      {
        "sepal_length": 3,
        "sepal_width": 1,
        "petal_length": 2.2,
        "petal_width": 4
      }
    ]
  }
}

其中,“meta”中可携带“uuid”,调用时传入一个“uuid”,返回预测结果时回传此“uuid”用于跟踪请求,如无此需要可不填写meta“data”包含了一个“req_data”的数组,可传入单条或多条请求数据,其中每个数据的参数由AI应用决定,比如本例中的“sepal_length”、“sepal_width”等。

参数填写完成,单击“send”发送请求,结果会在“Response”下的对话框里显示。

文件输入形式的预测结果样例如图6所示,返回结果的字段值根据不同AI应用可能有所不同。
文本输入形式的预测结果样例如图7所示,请求体包含“meta”及“data”。如输入请求中包含“uuid”,则输出结果中回传此“uuid”。如未输入,则为空。“data”包含了一个“resp_data”的数组,返回单条或多条输入数据的预测结果,其中每个结果的参数由AI应用决定,比如本例中的“sepal_length”、“predictresult”等。

图6 文件输入预测结果

图7 文本输入预测结果

方式二:使用curl命令发送预测请求

使用curl命令发送预测请求的命令格式也分为文件输入、文本输入两类。

文件输入

curl -kv -F 'images=@图片路径' -H 'X-Auth-Token:Token' -X POST 在线服务地址

“-k”是指允许不使用证书到SSL站点。
“-F”是指上传数据的是文件,本例中参数名为“images”,这个名字可以根据具体情况变化,@后面是图片的存储路径。
“-H”是post命令的headers,Headers的Key值为“X-Auth-Token”,这个名字为固定的, Token值是获取的用户Token。
“POST”后面跟随的是在线服务的调用地址。

curl命令文件输入样例:

curl -kv -F 'images=@/home/data/test.png' -H 'X-Auth-Token:MIISkAY***80T9wHQ==' -X POST https://modelarts-infers-1.xxx/v1/infers/eb3e0c54-3dfa-4750-af0c-95c45e5d3e83

文本输入

curl -kv -d '{"data":{"req_data":[{"sepal_length":3,"sepal_width":1,"petal_length":2.2,"petal_width":4}]}}' -H 'X-Auth-Token:MIISkAY***80T9wHQ==' -H 'Content-type: application/json' -X POST https://modelarts-infers-1.xxx/v1/infers/eb3e0c54-3dfa-4750-af0c-95c45e5d3e83

“-d”是Body体的文本内容。

方式三:使用Python语言发送预测请求

下载Python SDK并在开发工具中完成SDK配置。具体操作请参见在Python环境中集成API请求签名的SDK。
创建请求体,进行预测请求。

输入为文件格式

# coding=utf-8

import requests

if __name__ == '__main__':
    # Config url, token and file path.
    url = "在线服务的调用地址"
    token = "用户Token"
    file_path = "预测文件的本地路径"

    # Send request.
    headers = {
        'X-Auth-Token': token
    }
    files = {
        'images': open(file_path, 'rb')
    }
    resp = requests.post(url, headers=headers, files=files)

    # Print result.
    print(resp.status_code)
    print(resp.text)

“files”中的参数名由在线服务的输入参数决定,需要和“类型”为“file”的输入参数“名称”保持一致。以前提条件里获取的文件预测输入参数“images”为例。

输入为文本格式(json类型)

读取本地预测文件并进行base64编码的请求体示例如下:

# coding=utf-8

import base64
import requests

if __name__ == '__main__':
    # Config url, token and file path
    url = "在线服务的调用地址"
    token = "用户Token"
    file_path = "预测文件的本地路径"
    with open(file_path, "rb") as file:
        base64_data = base64.b64encode(file.read()).decode("utf-8")

    # Set body,then send request
    headers = {
        'Content-Type': 'application/json',
        'X-Auth-Token': token
    }
    body = {
        'image': base64_data
    }
    resp = requests.post(url, headers=headers, json=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工程依赖httpmime模块。

在工程“libs”中增加httpmime-x.x.x.jar。完整的Java依赖库如图8所示。

httpmime-x.x.x.jar建议使用4.5及以上版本,下载地址:https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime。

图8 Java依赖库

httpmime-x.x.x.jar添加完成后,在Java工程的.classpath文件中,补充httpmime信息,如下所示:













创建Java类,进行预测请求。

输入为文件格式

Java的请求体示例如下:

// Package name of the demo.
package com.apig.sdk.demo;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.File;

public class MyTokenFile {

    public static void main(String[] args) {
        // Config url, token and filePath
        String url = "在线服务的调用地址";
        String token = "用户Token";
        String filePath = "预测文件的本地路径";

        try {
            // Create post
            HttpPost httpPost = new HttpPost(url);

            // Add header parameters
            httpPost.setHeader("X-Auth-Token", token);

            // Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark ("), contained in the body must be escaped.
            File file = new File(filePath);
            HttpEntity entity = MultipartEntityBuilder.create().addBinaryBody("images", file).setContentType(ContentType.MULTIPART_FORM_DATA).setCharset(Consts.UTF_8).build();
            httpPost.setEntity(entity);

            // Send post
            CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);

            // Print result
            System.out.println(response.getStatusLine().getStatusCode());
            System.out.println(EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

“addBinaryBody”中的参数名由在线服务的输入参数决定,需要和“类型”为“file”的输入参数“名称”保持一致。此处以前提条件里获取的“images”为例。

输入为文本格式(json类型)

读取本地预测文件并进行base64编码的请求体示例如下:

// Package name of the demo.
package com.apig.sdk.demo;

import org.apache.http.HttpHeaders;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class MyTokenTest {

    public static void main(String[] args) {
        // Config url, token and body
        String url = "在线服务的调用地址";
        String token = "用户Token";
        String body = "{}";

        try {
            // Create post
            HttpPost httpPost = new HttpPost(url);

            // Add header parameters
            httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
            httpPost.setHeader("X-Auth-Token", token);

            // Special characters, such as the double quotation mark ("), contained in the body must be escaped.
            httpPost.setEntity(new StringEntity(body));

            // Send post.
            CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);

            // Print result
            System.out.println(response.getStatusLine().getStatusCode());
            System.out.println(EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

“body”由具体文本格式决定,此处以json为例。

父主题: 认证方式

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家