更新时间:2025-03-04 gmt 08:00

通过token认证的方式访问在线服务-九游平台

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

约束限制

调用api访问在线服务时,对预测请求体大小和预测时间有限制:
  • 请求体的大小不超过12mb,超过后请求会被拦截。
  • 因apig(api网关)限制,平台每次请求预测的时间不超过40秒。

前提条件

已经获取用户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 获取在线服务api接口地址和文件预测输入参数信息

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

  1. 下载postman软件并安装,您也可以直接在chrome浏览器添加postman扩展程序(也可使用其他支持发送post请求的软件)。postman推荐使用7.24.0版本。
  2. 打开postman,如图2所示。
    图2 postman界面
  3. 在postman界面填写参数,以图像分类举例说明。
    • 选择post任务,将在线服务的调用地址复制到post后面的方框。headers页签的key值填写为“x-auth-token”,value值为用户token。

      您也可以通过ak(access key id)/sk(secret access key)加密调用请求,具体可参见用户ak-sk认证模式

      图3 参数填写
    • 在body页签,根据模型的输入参数不同,可分为2种类型:文件输入、文本输入。
      • 文件输入

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

        图4 填写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”的数组,可传入单条或多条请求数据,其中每个数据的参数由模型决定,比如本例中的“sepal_length”“sepal_width”等。

  4. 参数填写完成,单击“send”发送请求,结果会在“response”下的对话框里显示。
    • 文件输入形式的预测结果样例如图5所示,返回结果的字段值根据不同模型可能有所不同。
    • 文本输入形式的预测结果样例如图6所示,请求体包含“meta”“data”。如输入请求中包含“uuid”,则输出结果中回传此“uuid”。如未输入,则为空。“data”包含了一个“resp_data”的数组,返回单条或多条输入数据的预测结果,其中每个结果的参数由模型决定,比如本例中的“sepal_length”“predictresult”等。
      图5 文件输入预测结果
      图6 文本输入预测结果

方式二:使用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语言发送预测请求

  1. 下载python sdk并在开发工具中完成sdk配置。具体操作请参见在python环境中集成api请求签名的sdk
  2. 创建请求体,进行预测请求。
    • 输入为文件格式
      # 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语言发送预测请求

  1. 下载java sdk并在开发工具中完成sdk配置。具体操作请参见在java环境中集成api请求签名的sdk
  2. (可选)当预测请求的输入为文件格式时,java工程依赖httpmime模块。
    1. 在工程“libs”中增加httpmime-x.x.x.jar。完整的java依赖库如图7所示。

      httpmime-x.x.x.jar建议使用4.5及以上版本,下载地址:。

      图7 java依赖库
    2. httpmime-x.x.x.jar添加完成后,在java工程的.classpath文件中,补充httpmime信息,如下所示:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
  3. 创建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为例。

相关文档

网站地图