Skip To Content

使用 ArcGIS REST API 编写脚本

ArcGIS Enterprise 可以完全通过向 ArcGIS REST API 发送的请求进行管理。 即使在使用服务器或门户执行管理任务时,对 API 的调用仍在后台进行。 要编写管理 ArcGIS Enterprise 的脚本,必须选择一种可以构建 URL、进行 HTTP 请求和解析 HTTP 响应的脚本语言。 本帮助系统中的示例使用的是 Python

使用 API 不要求运行脚本的计算机上安装有任何 Esri 软件。 仅需提供能够对门户进行 HTTP 请求的环境。

入门

要使用 ArcGIS REST API,需为待执行的操作创建 HTTP 请求并添加该操作所需的参数。 通过浏览可与 ArcGIS REST API 交互的目录系列,您可以熟悉管理操作及其所需的参数。 ArcGIS Enterprise REST API 通过两个门户目录和两个服务器目录暴露。

使用 ArcGIS REST API

门户和服务器目录提供组织 ArcGIS REST API 资源的交互式视图。 使用这些目录可帮助您了解如何为组织编写管理脚本。

门户目录的 URL 的格式如下:

  • 门户目录 - https://webadaptorhost.domain.com/webadaptorname/sharing/rest
  • 门户管理目录 - https://webadaptorhost.domain.com/webadaptorname/portaladmin

服务器目录的 URL 的格式如下:

要熟悉 ArcGIS REST API,使用其中一个目录执行管理任务。 记下您需要输入的参数,并在对服务器进行请求时检查浏览器地址栏中的 URL。 查看请求和响应的完整内容时,可能会用到 Web 开发者工具(例如 Fiddler 或 Firebug)。 当尝试通过 Python 或其他脚本语言构建您自己的管理 HTTP 请求时,此信息十分重要。

生成令牌并在脚本中使用

当您通过门户、服务器或其相应目录管理组织时,需要提供具有适当权限的帐户的用户名和密码。 同样的概念也适用于编写脚本时。 但是,您必须了解使用脚本管理组织时进行身份验证的方式。

如果组织已配置为使用内置帐户和令牌身份验证,您在脚本中使用的管理帐户和 URL 可以和用于门户和服务器目录的帐户和 URL 相同。 如果组织已配置组织特定的登录帐户和 Web 层身份验证,则建议将脚本绕过 Web Adaptor。 使用安装 Portal for ArcGIS 之后创建的初始管理员帐户访问门户或使用安装 ArcGIS Server 之后创建的主站点管理员帐户访问服务器。

在任一情况下,您都将收到一个返回的令牌(即一个特殊的字符串),此令牌用于向门户或服务器传达您具有执行某些类型操作的权限。 您所进行的所有 Web 服务请求中都必须包含此令牌。

以下 Python 函数用于请求门户令牌。 门户的 URL、用户名和密码将作为参数提供。

def generateToken(username, password, portalUrl):
    '''Retrieves a token to be used with API requests.'''
    data = urllib.parse.urlencode({'username' : username,
                                   'password' : password,
                                   'client' : 'referer',
                                   'referer': portalUrl,
                                   'expiration': 60,
                                   'f' : 'json'}).encode('utf-8')
    response = urllib.request.urlopen(portalUrl + '/sharing/rest/generateToken',
                                      data).read().decode('utf-8')
    try:
        jsonResponse = json.loads(response)
        if 'token' in jsonResponse:
            return jsonResponse['token']
        elif 'error' in jsonResponse:
            print(jsonResponse['error']['message'])
            for detail in jsonResponse['error']['details']:
                print(detail)
    except ValueError as e:
        print('An unspecified error occurred.')
        print(e)

以下 Python 函数用于请求服务器令牌。 服务器的 URL、用户名和密码将作为参数提供。

def generateToken(username, password, serverUrl):
    '''Retrieves a token to be used with API requests.'''
    data = urllib.parse.urlencode({'username' : username,
                                   'password' : password,
                                   'client' : 'referer',
                                   'referer': serverUrl,
                                   'expiration': 60,
                                   'f' : 'json'}).encode('utf-8')
    response = urllib.request.urlopen(serverUrl + '/tokens/generateToken',
                                      data).read().decode('utf-8')
    try:
        jsonResponse = json.loads(response)
        if 'token' in jsonResponse:
            return jsonResponse['token']
        elif 'error' in jsonResponse:
            print(jsonResponse['error']['message'])
            print(jsonResponse['error']['details'])
    except ValueError as e:
        print('An unspecified error occurred.')
        print(e)

令牌不会永远有效;它具有超时设计,以防被恶意用户偷窃并无限期使用。 通常,每次运行脚本时(但并非每次进行请求时),必须请求一个新令牌。 在一些异常情况下,令牌会在脚本运行结束之前过期。 如果您的请求包含了过期令牌,来自服务器的响应将包含一条表明令牌已过期的错误消息。 如果发生这种情况,请刷新令牌并继续运行脚本。

使用请求和响应

要进行 Web 服务请求,需要格式化要进行的操作的 URL 以及该操作所需的参数。 令牌(类似于上文中生成的令牌)是其中一个必填参数。

所有管理操作都会生成一个 web 服务响应,通常以“JavaScript 对象标记法”(JSON) 格式请求。 脚本语言(例如 Python)具有可以解析或读取 JSON 响应的库。 有时,只需要获取 HTTP 状态代码来查看请求是否成功(例如,代码 200 表示正常)。 但在其他时候,响应可能包含您希望进一步解析和检查的数据(如日志消息)。