通过HTTPS协议访问实例

本文介绍如何通过HTTPS协议访问已开启安全访问代理的目标实例。

前提条件

  • 实例已开启安全访问代理。

    说明

    安全与规范 > 安全访问代理已开通页面,查看已开启安全访问代理的实例列表。如需开启,请参见开启安全访问代理

  • 您已获得安全访问代理的授权。

    说明

    在安全访问代理的详情页面,查看实例的授权情况。如果您还没有获得授权,请参见申请安全访问代理授权

注意事项

开启安全访问代理的安全协同实例受安全规则的限制,系统规定单次查询数据最多返回100000行数据。

设置单次查询最大返回行数

前往DMS安全与规范 > 安全规则 > 安全访问代理中设置单次查询最大返回行数。

image

说明
  • 若希望避免安全规则的限制,请使用数据库控制台提供的连接地址访问数据库,或联系DMS技术支持评估具体场景。

  • 如果是非安全协同实例,不支持自主配置查询最大返回行数。默认查询最大返回行数为3000。

请求参数说明

参数名

含义

是否必须

传递方式

accessId

AccessID

accessId支持以下传值方式:

  • Query参数。

    例如:?accessId=AccessID

  • Header参数。

    例如:accessId:AccessID

accessSecret

AccessSecret

accessSecret支持以下传值方式:

  • Query参数。

    例如:?accessSecret=AccessSecret

  • Header参数。

    例如:accessSecret:AccessSecret

schema

数据库名称

schema支持以下传值方式:

  • URL路径参数。

    例如:/server/[您的数据库名]

  • Body参数。

    例如:{ "schema": "[您的数据库名]" }

sql

SQL语句

SQL支持以下传值方式:

  • URL参数。

  • Body参数。

    例如:纯文本格式:[您的SQL语句]

    JSON格式:{ "sql": "[您的SQL语句]" }

返回值说明

通过HTTPS协议访问,以JSON格式返回数据。

JSON对象格式如下:

字段名

类型

描述

columnMetas

Array

字段元信息列表。

columnName

String

字段名。

columnLabel

String

字段标签,对应SQL语句中as后的别名,没有别名时,则与columnName一致。

columnTypeName

String

字段类型,例如VARCHAR,BIGINT等。

precision

Integer

精度,部分字段类型包含精度定义,例如VARCHAR(32)的精度为32。

scale

Integer

范围,浮点型的字段类型包含范围定义,表示小数位数,例如DECIMAL(10,2)的范围为2。

nullable

Boolean

能否为空,true表示值可以为空,false表示值不可为空。

autoIncrement

Boolean

是否自增,true表示自增,false表示非自增。

tableName

String

字段所在的表名。

msg

String

执行出错时,返回错误信息。

updateCount

Integer

执行DML时,影响的记录数。

requestId

String

请求ID,遇到问题时用于帮助排查。

rowCount

Integer

查询操作时,返回的记录数。

rows

Array

查询操作时,返回的记录列表,数组中每个元素表示一行数据,与List Map结构相同。

success

Boolean

执行是否成功,true表示成功,false表示失败。

返回值示例如下:

  • 成功查询到数据。

    {
      "columnMetas": [
        {
          "columnName":"column1",
          "columnLabel":"column1",
          "columnTypeName":"varchar",
          "precision":10,
          "scale":2,
          "nullable":true,
          "autoIncrement":true,
          "tableName":"table1"
        },
        {
          "columnName":"column2",
          "columnLabel":"column2",
          "columnTypeName":"varchar",
          "precision":10,
          "scale":2,
          "nullable":true,
          "autoIncrement":true,
          "tableName":"table1"
        } 
      ],
      "updateCount": 0,
      "requestId": "xhqej0xgcytbhc8scjopgqsywcaibi",
      "rowCount": 1,
      "rows": [
        {
          "col1": 1,
          "col2": "xxxx"
        }
      ],
      "success": true
    }
  • 成功更新数据。

    {
      "updateCount": 0,
      "requestId": "xhqej0xgcytbhc8scjopgqsywcaibi",
      "success": true
    }
  • 访问失败。

    {
      "message": 'AccessID is required.',
      "requestId": "xhqej0xgcytbhc8scjopgqsywcaibi",
      "success": false
    }

访问示例

您可以通过命令行、数据库管理工具、程序代码来访问已开启安全访问代理的目标实例。

假设连接地址为dpxxxx-xxxxxxxx.proxy.dms.aliyuncs.com,数据库名称为database,accessId为user,accessSecret为pwd,SQL命令为show databases。

  • 使用CURL命令行访问的示例。

    # GET请求
    curl 'https://[您的连接地址]/server/[您的数据库名]?accessId=[您的AccessID]&accessSecret=[您的AccessSecret]&sql=[SQL语句]'
    # GET请求示例
    curl 'https://dpxxxx-xxxxxxxx.proxy.dms.aliyuncs.com/server/database?accessId=user&accessSecret=pwd&sql=SHOW%20DATABASES'
    # POST请求
    curl 'https://[您的连接地址]/server/[您的数据库名]' -H 'accessId:[您的AccessID]' -H 'accessSecret:[您的AccessSecret] -H 'Content-Type:text/plain' -d '[SQL语句]'
    # POST请求示例
    curl 'https://dpxxxx-xxxxxxxx.proxy.dms.aliyuncs.com/server/database' -H 'accessId:user' -H 'accessSecret:pwd -H 'Content-Type:text/plain' -d 'SHOW DATABASES'
  • Python程序访问的示例。

    说明

    以Python 2版本访问举例。

    GET请求:

    import requests
    
    url = "https://[连接地址]/server/[您的数据库名]?accessId=[您的AccessID]&accessSecret=[您的AccessSecret]&sql=[sql语句]"
    print requests.get(url).text

    GET请求示例:

    import requests
    
    url = "https://dpxxxx-xxxxxxxx.proxy.dms.aliyuncs.com/server/database?accessId=user&accessSecret=pwd&sql=SHOW DATABASES"
    print requests.get(url).text

    POST请求:

    import requests
    
    url = "https://[连接地址]/server/[您的数据库名]"
    headers = {
        "Content-Type": "text/plain;charset=utf-8",
        "accessId": "[您的AccessID]",
        "accessSecret": "[您的AccessSecret]"
    }
    print requests.post(url, headers=headers, data='[sql语句]').text

    POST请求示例:

    import requests
    
    url = "https://dpxxxx-xxxxxxxx.proxy.dms.aliyuncs.com/server/database"
    headers = {
        "Content-Type": "text/plain;charset=utf-8",
        "accessId": "user",
        "accessSecret": "pwd"
    }
    print requests.post(url, headers=headers, data='SHOW DATABASES').text
  • Node.js程序访问的示例。

    GET请求:

    const https = require("https");
    
    https.get("https://[连接地址]/server/[您的数据库名]?accessId=[您的AccessID]&accessSecret=[您的AccessSecret]&sql=SHOW DATABASES", resp => {
        resp.on("data", data => {
            console.log(JSON.parse(data));
        });
    });

    GET请求示例:

    const https = require("https");
    
    https.get("https://dpxxxx-xxxxxxxx.proxy.dms.aliyuncs.com/server/database?accessId=user&accessSecret=pwd&sql=SHOW DATABASES", resp => {
        resp.on("data", data => {
            console.log(JSON.parse(data));
        });
    });

    POST请求:

    const https = require("https");
    
    var req = https.request({
        hostname: '[连接地址]',
        port: 443,
        path: '/server/[您的数据库名]',
        method: 'POST',
        headers: {
            'Content-Type': 'text/plain; charset=UTF-8',
            accessId: '[您的AccessID]',
            accessSecret: '[您的AccessSecret]'
        }
    }, resp => {
        resp.on("data", data => {
            console.log(JSON.parse(data));
        });
    });
    req.write("[sql语句]");
    req.end();

    POST请求示例:

    const https = require("https");
    
    var req = https.request({
        hostname: 'dpxxxx-xxxxxxxx.proxy.dms.aliyuncs.com',
        port: 443,
        path: '/server/database',
        method: 'POST',
        headers: {
            'Content-Type': 'text/plain; charset=UTF-8',
            accessId: 'user',
            accessSecret: 'pwd'
        }
    }, resp => {
        resp.on("data", data => {
            console.log(JSON.parse(data));
        });
    });
    req.write("SHOW DATABASES");
    req.end();
  • Postman客户端访问的示例。

    GET请求:postmanget

    POST请求:postmanpost