Skip To Content

Exemple : publication d'un service avec des paramètres détaillés

Il arrive que vous souhaitiez contrôler avec précision vos propriétés de service lors de la publication initiale d'un service. Pour ce faire, vous pouvez répertorier les paramètres de service dans un fichier texte à l'aide de la spécification JSON (JavaScript Object Notation). Appelez ensuite la méthode createService dans l'API REST d'ArcGIS et transmettez la définition JSON que vous avez lue dans le fichier.

Dans le cas d'un service de carte, vous devez indiquer un fichier MSD dans votre définition JSON. Ce fichier résume les informations de votre document ArcMap (MXD) dans un format compréhensible et affichable par ArcGIS Server. Vous devez utiliser le module arcpy.mapping pour analyser votre carte et créer le fichier MSD avant de poursuivre la création du service. Ce processus nécessite une machine équipée d'une licence ArcGIS for Desktop. Les autres types de service ne nécessitent pas l'utilisation du module arcpy.mapping ou la création d'un fichier MSD.

L'exemple ci-dessous illustre un fichier JSON. Consultez la référence de l'API REST d'ArcGIS pour obtenir des exemples détaillés sur la création du fichier JSON pour différents types de service.

{  "serviceName": "Beirut",  "type": "MapServer",  "description": "Service showing Beirut parcels and streets.",  "capabilities": "Map,Query,Data",  "clusterName": "default",  "minInstancesPerNode": 1,  "maxInstancesPerNode": 3,  "instancesPerContainer": 1,  "maxWaitTime": 60,  "maxStartupTime": 300,  "maxIdleTime": 1800,  "maxUsageTime": 600,  "loadBalancing": "ROUND_ROBIN",  "isolationLevel": "HIGH",  "configuredState": "STARTED",  "recycleInterval": 24,  "recycleStartTime": "00:00",  "keepAliveInterval": 1800,  "private": false,  "isDefault": false,  "properties": {    "maxBufferCount": "100",    "maxImageHeight": "2048",    "maxRecordCount": "1000",    "filePath": "c:\\data\\Beirut\\Beirut_Parcels.msd",    "maxImageWidth": "2048",    "enableDynamicLayers": "false",    "cacheOnDemand": "false",    "dynamicDataWorkspaces": "",    "useLocalCacheDir": "true",    "outputDir": "c:\\arcgisserver\\directories\\arcgisoutput",    "virtualOutputDir": "/rest/directories/arcgisoutput",    "supportedImageReturnTypes": "URL",    "isCached": "false",    "ignoreCache": "false",    "clientCachingAllowed": "true",    "cacheDir": ""  },  "extensions": [],  "datasets": []}

Le code ci-dessous indique comment référencer le contenu de ce fichier JSON dans un script Python lors de la publication d'un service.

# Demonstrates how to publish a service from a JSON definition file
# An MSD file is required, which is made from the MXD in this script

# For Http calls
import httplib, urllib, json, arcpy, os

# For system tools
import sys

# For reading passwords without echoing
import getpass


# Defines the entry point into the script

def main(argv=None):
    # Print some info
    print
    print "This tool is a sample script that publishes a service using an MXD and JSON definiton."
    print
    
    # Ask for admin/publisher user name and password
    username = raw_input("Enter user name: ")
    password = getpass.getpass("Enter password: ")

    # Ask for other necessary information
    serverName = raw_input("Enter Server name: ")
    serverPort = 6080
    mxdPath = raw_input("Enter the path to the MXD: ")
    msdPath = raw_input("Enter the desired path for the MSD: ")
    jsonPath = raw_input("Enter the path to the JSON file: ")

    # Analyze MXD and create MSD file
    if not os.path.isfile(mxdPath):
        return

    if mxdPath.endswith('.mxd'):
        mapErrors = analyzeMap(mxdPath)
        if len(mapErrors) > 0:
            print "Fix map errors before converting to mxd"
            return
        mxd = arcpy.mapping.MapDocument(mxdPath)
        convertMap(mxd, msdPath);
        del mxd  
    else:
        print "Invalid file type submitted"
        return

    # Get a token
    token = getToken(username, password, serverName, serverPort)
    if token == "":
        print "Could not generate a token with the username and password provided."
        return

    # Read the JSON file for the service
    serviceJSON = open(jsonPath).read()
    
    # Construct URL to create a service
    # If publishing to a folder, invoke createService on the folder URL
    createServiceURL = "/arcgis/admin/services/createService"
    
    # This request needs the token, the JSON defining the service properties,
    #  and the response format 
    params = urllib.urlencode({'token': token, 'service':serviceJSON, 'f': 'json'})
    
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
    
    # Connect to URL and post parameters    
    httpConn = httplib.HTTPConnection(serverName, serverPort)
    httpConn.request("POST", createServiceURL, params, headers)
    
    # Read response
    response = httpConn.getresponse()
    if (response.status != 200):
        httpConn.close()
        print "Error while creating the service."
        return
    else:
        data = response.read()
        httpConn.close()
        
        # Check that data returned is not an error object
        if not assertJsonSuccess(data):          
            print "Error returned by operation. " + data
        else:
            print "Operation completed successfully!"
        
        return

# A function to analyze a map document
def analyzeMap(mapPath):
    mxd = arcpy.mapping.MapDocument(mapPath)
    analysis = arcpy.mapping.AnalyzeForMSD(mxd)

    vars = analysis['errors']
    for ((message, code), layerlist) in vars.iteritems():
      print "Errors: "
      print message, " (CODE %i)" % code
      print "       applies to the following layers:",
      for layer in layerlist:
          print layer.name,
      print
        
    del mxd
    return analysis['errors']

# A function to convert a map document to a map service definition (MSD)
def convertMap(mxd, msd):
    arcpy.mapping.ConvertToMSD(mxd, msd, "USE_ACTIVE_VIEW", "NORMAL", "NORMAL")
    del mxd, msd

# A function to generate a token given username, password and the adminURL.
def getToken(username, password, serverName, serverPort):
    # Token URL is typically http://server[:port]/arcgis/admin/generateToken
    tokenURL = "/arcgis/admin/generateToken"
    
    # URL-encode the token parameters
    params = urllib.urlencode({'username': username, 'password': password, 'client': 'requestip', 'f': 'json'})
    
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
    
    # Connect to URL and post parameters
    httpConn = httplib.HTTPConnection(serverName, serverPort)
    httpConn.request("POST", tokenURL, params, headers)
    
    # Read response
    response = httpConn.getresponse()
    if (response.status != 200):
        httpConn.close()
        print "Error while fetching tokens from admin URL. Please check the URL and try again."
        return
    else:
        data = response.read()
        httpConn.close()
        
        # Check that data returned is not an error object
        if not assertJsonSuccess(data):            
            return
        
        # Extract the token from it
        token = json.loads(data)        
        return token['token']            
        

# A function that checks that the input JSON object 
#  is not an error object.
    
def assertJsonSuccess(data):
    obj = json.loads(data)
    if 'status' in obj and obj['status'] == "error":
        print "Error: JSON object returns an error. " + str(obj)
        return False
    else:
        return True
    
        
# Script start
if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))