全部产品

调用交通云控平台API

本文为您介绍交通行业应用如何调用交通云控平台API。

前提条件

  • 您已创建好了您的交通行业应用。

  • 已有阿里云账号。如果未注册阿里云账号,请先注册账号。具体请参见阿里云账号注册流程

流程图

交通行业应用调用交通云控平台API的流程如下:

流程图

服务检索和开通

在调用交通云控平台API之前,您需要先完成数据服务的检索和开通。数据服务的检索和开通分为接口搜索、接口调试、接口开通三个步骤。

  1. 接口搜索,了解交通云控平台是否含有您应用所需要调用的接口。

    1. 登录交通云控平台

    2. 选择数字化还原 > 运行信息还原 > 数据服务

    3. 单击数据接口页签。

      数据接口页面,可以看到目前项目包含的所有接口信息。您可选择实体业务应用接口状态来查看不同的接口;也可以直接在搜索框输入关键字进行索引,索引关键字支持接口名称、实体信息、指标信息、业务应用类型、数据模型信息等。

      数据接口
  2. 接口调试,通过在线调试可以确定接口是否能正常获取数据。

    1. 数据接口页面单击某一具体接口名。

      以“获取路口指定日期分时间片拥堵事件信息”接口为例,可以在详情页看到接口的调用地址、调用方式、请求参数等信息。

    2. 输入请求参数值,单击接口调试,在响应详情处获取结果。

      接口调试
    3. 单击响应详情中的查看执行SQL,获取接口实际执行的SQL语句。若调试失败,响应详情中显示错误码,您可对照错误参照码查看失败原因。

      查看响应

  3. 接口开通。

    当确定需要调用的数据接口后,返回数据接口页面执行开通操作如下图所示,选中所需接口,单击开通按钮。如果选择错误,单击接口右侧的取消开通即可取消开通。

    接口开通后,每个接口对应的表会自动添加到数据质量监控,数据表开发完成并有数据产出后,您可进行接口调用操作。

应用授权

为确保服务安全,调用API时需要传入AK信息(AppKey和AppSecret密钥)对调用者身份进行验证。您需要通过应用授权,并获取AK信息。

  1. 登录阿里云API网关控制台

  2. 在左上角选择项目所属区域后,选择调用API > 应用管理

  3. 创建应用对话框中填写应用名称,选填标签设置描述,单击确定

    创建应用
  4. 将创建成功的应用AppId提供给与您对接的阿里技术人员。

    AppId
  5. 单击应用名称,获取AK信息。

    AK信息
    注意

    AppKeyAppSecret是网关认证用户请求的密钥,请妥善保管。

API调用

本文以Java为例介绍交通云控平台API调用的流程。

  1. 添加pom依赖。

    在pom.xml中添加如下依赖,网关SDK适用于JDK 1.6及以上版本。

    <dependency>
        <groupId>com.aliyun.api.gateway</groupId>
        <artifactId>sdk-core-java</artifactId>
        <version>1.1.5</version>
    </dependency>
  2. 引入API接口调用类。

    DatafusionHttpApiClient.java CallDemo.java复制到您的项目文件夹中,修正类文件的包路径。

    • DatafusionHttpApiClient.java

      package com.aliyun.brain.datafusion.datasource.common;
      import com.alibaba.cloudapi.sdk.client.ApacheHttpClient;
      import com.alibaba.cloudapi.sdk.enums.Scheme;
      import com.alibaba.cloudapi.sdk.enums.HttpMethod;
      import com.alibaba.cloudapi.sdk.model.ApiRequest;
      import com.alibaba.cloudapi.sdk.model.ApiResponse;
      import com.alibaba.cloudapi.sdk.model.ApiCallback;
      import com.alibaba.cloudapi.sdk.model.HttpClientBuilderParams;
      import com.alibaba.cloudapi.sdk.enums.ParamPosition;
      
      import java.util.List;
      import java.util.Map;
      
      
      public class DatafusionHttpApiClient extends ApacheHttpClient{
      
          public final static String HOST = "${host}";
          public final static String PATH = "${path}";
      
          static DatafusionHttpApiClient instance = new DatafusionHttpApiClient();
      
          public static DatafusionHttpApiClient getInstance() {
              return instance;
          }
      
          @Override
          public void init(HttpClientBuilderParams httpClientBuilderParams){
              httpClientBuilderParams.setScheme(Scheme.HTTP);
              httpClientBuilderParams.setHost(HOST);
              super.init(httpClientBuilderParams);
          }
      
          /**
           * 异步调用GET
           * @param apiName 接口名称
           * @param requestParams 请求参数
           * @param callback
           */
          public void sendGet(String apiName, Map<String, String> requestParams, ApiCallback callback) {
              ApiRequest request = new ApiRequest(HttpMethod.GET , PATH);
              request.addParam("apiName" , apiName , ParamPosition.PATH , true);
      
              for (Map.Entry<String, String> entry : requestParams.entrySet()) {
                  request.addParam(entry.getKey(), entry.getValue(), ParamPosition.QUERY, true);
              }
      
              sendAsyncRequest(request, callback);
          }
      
          /**
           * 同步调用GET
           * @param apiName 接口名称
           * @param requestParams 请求参数
           * @return
           */
          public ApiResponse sendGet(String apiName, Map<String, String> requestParams) {
              ApiRequest request = new ApiRequest(HttpMethod.GET, PATH);
              request.addParam("apiName" , apiName , ParamPosition.PATH , true);
      
              for (Map.Entry<String, String> entry : requestParams.entrySet()) {
                  request.addParam(entry.getKey(), entry.getValue(), ParamPosition.QUERY, true);
              }
      
              return sendSyncRequest(request);
          }
      
          /**
           * 异步调用POST
           * @param apiName 接口名称
           * @param formParams form-data
           * @param callback
           */
          public void senPost(String apiName, Map<String, List<String>> formParams, ApiCallback callback) {
              ApiRequest request = new ApiRequest(HttpMethod.POST_FORM, PATH);
              request.addParam("apiName" , apiName , ParamPosition.PATH , true);
              request.setFormParams(formParams);
      
              sendAsyncRequest(request , callback);
          }
      
          /**
           * 同步调用POST
           * @param apiName 接口名称
           * @param formParams form-data
           * @return
           */
          public ApiResponse sendPost(String apiName, Map<String, List<String>> formParams) {
              ApiRequest request = new ApiRequest(HttpMethod.POST_FORM, PATH);
              request.addParam("apiName" , apiName , ParamPosition.PATH , true);
              request.setFormParams(formParams);
      
              return sendSyncRequest(request);
          }
      }
    • CallDemo.java

      package com.aliyun.brain.datafusion.datasource.common;
      
      import com.alibaba.cloudapi.sdk.constant.SdkConstant;
      import com.alibaba.cloudapi.sdk.model.ApiCallback;
      import com.alibaba.cloudapi.sdk.model.ApiRequest;
      import com.alibaba.cloudapi.sdk.model.ApiResponse;
      import com.alibaba.cloudapi.sdk.model.HttpClientBuilderParams;
      import java.util.ArrayList;
      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
      
      
      public class CallDemo {
      
          /**
           * appKey和appSecret 替换为项目实际授权的ak信息
           */
          public static final String appKey = "${appKey}";
          public static final String appSecret = "${appSecret}";
      
          /**
           * 测试接口名
           */
          public static final String testApiName = "getRidInfo";
          public static Map<String, String> requestParams = new HashMap<>();
          public static Map<String, List<String>> formParams = new HashMap<>();
      
          static{
              //HTTP Client init
              HttpClientBuilderParams httpParam = new HttpClientBuilderParams();
              httpParam.setAppKey(appKey);
              httpParam.setAppSecret(appSecret);
              DatafusionHttpApiClient.getInstance().init(httpParam);
      
              // GET请求参数 (请使用实际项目中的样例值)
              requestParams.put("rid", "14SA909FP0014SB609FP400");
              requestParams.put("adcode", "310000");
      
              // POST请求体
              List<String> rid = new ArrayList<>();
              rid.add("14SA909FP0014SB609FP400");
              List<String> adcode = new ArrayList<>();
              adcode.add("310000");
              formParams.put("rid", rid);
              formParams.put("adcode", adcode);
      
          }
      
          /**
           * 同步调用GET示例
           */
          public static void syncGetTest(){
      
              ApiResponse response = DatafusionHttpApiClient.getInstance().sendGet(testApiName, requestParams);
      
              try {
                  System.out.println("同步调用GET......");
                  System.out.println(getResultString(response));
              }catch (Exception ex){
                  ex.printStackTrace();
              }
          }
      
          /**
           * 异步调用GET示例
           */
          public static void asyncGetTest(){
      
              DatafusionHttpApiClient.getInstance().sendGet(testApiName, requestParams, new ApiCallback() {
      
                  @Override
                  public void onFailure(ApiRequest request, Exception e) {
                      e.printStackTrace();
                  }
      
                  @Override
                  public void onResponse(ApiRequest request, ApiResponse response) {
                      try {
                          System.out.println("异步调用GET......");
                          System.out.println(getResultString(response));
                      }catch (Exception ex){
                          ex.printStackTrace();
                      }
                  }
              });
          }
      
          /**
           * 同步调用POST示例
           */
          public static void syncPostTest(){
      
              ApiResponse response = DatafusionHttpApiClient.getInstance().sendPost(testApiName, formParams);
      
              try {
                  System.out.println("同步调用POST......");
                  System.out.println(getResultString(response));
              }catch (Exception ex){
                  ex.printStackTrace();
              }
          }
      
          /**
           * 异步调用POST示例
           */
          public static void asyncPostTest(){
      
              DatafusionHttpApiClient.getInstance().senPost(testApiName, formParams, new ApiCallback() {
                  @Override
                  public void onFailure(ApiRequest request, Exception e) {
                      e.printStackTrace();
                  }
      
                  @Override
                  public void onResponse(ApiRequest request, ApiResponse response) {
                      try {
                          System.out.println("异步调用POST......");
                          System.out.println(getResultString(response));
                      }catch (Exception ex){
                          ex.printStackTrace();
                      }
                  }
              });
          }
      
          private static String getResultString(ApiResponse response) {
              StringBuilder result = new StringBuilder();
      
              result.append("Response from backend server").append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF);
              result.append("ResultCode:").append(SdkConstant.CLOUDAPI_LF).append(response.getCode()).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF);
              if(response.getCode() != 200){
                  result.append("Error description:").append(response.getHeaders().get("X-Ca-Error-Message")).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF);
              }
      
              result.append("ResultBody:").append(SdkConstant.CLOUDAPI_LF).append(new String(response.getBody() , SdkConstant.CLOUDAPI_ENCODING));
      
              return result.toString();
          }
      
          public static void main(String[] args) {
              asyncGetTest();
              syncGetTest();
              asyncPostTest();
              syncPostTest();
          }
      }
  3. 替换AK信息。

    CallDemo类中的${appKey}和${appSecret}替换为您应用的AK信息,并设置要测试的接口名和参数。如何获取AK信息,请参见应用授权

  4. 替换host和path。

    DatafusionHttpApiClient类中${host}和${path}设置为公网的host和path。

    公网host:api-citybrain.cn-shanghai.aliyun.com

    公网path:  /datafusion/dataApi/call/[apiName]

    说明

    无需修改任何内容([apiName]也无需修改),直接替换掉类中的${path}。

我们为您提供了多语言调用示例,您可以根据自己的开发习惯,下载相应的SDK,将示例代码中 AppKey、AppSecret替换成您自己的真实密钥值,参考SDK示例中的使用方法,在应用中发起服务调用请求。

调用接口测试

SDK封装了单例模式的调用方法,可以使用getInstance()方法来获得HttpClient类对象。每个API同时提供同步和异步的调用方法,CallDemo.java提供了GETPOST方法的调用示例,调试前请替换文件中的appKeyappSecrethostpath

调用CallDemo的main方法,观察请求结果是否正常:

  • GET方法

    调用测试1
  • POST方法

    调用测试2