ArcGIS REST API を使用して、既存のサービスのプロパティを編集できます。以下の例では、指定したサービスに対して各 GIS サーバーで実行可能な最小および最大インスタンス数を編集します。
REST API による編集操作では、サービスの編集の後にプロパティが適切な状態に維持されるように、すべてのサービス プロパティの JSON 定義を渡す必要があります。最も簡単な方法では、最初にサービスを呼び出して現在のプロパティを取得し、プロパティを適切に変更した後、変更したプロパティのセットをパラメーターとして編集操作に戻します。
この例では、サービスの最初の呼び出しを行った後、JSON の応答を Python オブジェクトにデシリアライズしています。続いて、スクリプトがプロパティを適切に変更して、Python オブジェクトを JSON に再度シリアライズします。この編集された JSON が編集操作に渡されます。
インスタンスの最小数と最大数だけでなく、他のサービス プロパティでもこのパターンに従います。
ArcGIS Server Administrator Directory を使用してサービスの JSON 表現を確認するのも有効です (Administrator Directory のサービス URL に f=json を追加します)。この方法は、プロパティの JSON 名を確認する際に役立ちます。この例では、minInstancesPerNode や maxInstancesPerNode などが使用されています。
# Demonstrates how to modify the min and max instances for a service
# For Http calls
import httplib, urllib, json
# 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 resets the minimum and maximum instances allowed for a service."
print
# Ask for admin/publisher user name and password
username = raw_input("Enter user name: ")
password = getpass.getpass("Enter password: ")
# Ask for server name
serverName = raw_input("Enter Server name: ")
serverPort = 6080
print r"Enter the service name in the format <folder>/<name>.<type>."
service = raw_input(r"For example USA/Chicago.MapServer: ")
minInstances = raw_input("Enter the new minimum: ")
maxInstances = raw_input("Enter the new maximum: ")
# Check to make sure the minimum and maximum are numerical
try:
minInstancesNum = int(minInstances)
maxInstancesNum = int(maxInstances)
except ValueError:
print "Numerical value not entered for minimum, maximum, or both."
return
# Check to make sure that the minimum is not greater than the maximum
if minInstancesNum > maxInstancesNum:
print "Maximum number of instances must be greater or equal to minimum number."
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
serviceURL = "/arcgis/admin/services/" + service
# This request only needs the token and the response formatting parameter
params = urllib.urlencode({'token': token, 'f': 'json'})
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
# Connect to service to get its current JSON definition
httpConn = httplib.HTTPConnection(serverName, serverPort)
httpConn.request("POST", serviceURL, params, headers)
# Read response
response = httpConn.getresponse()
if (response.status != 200):
httpConn.close()
print "Could not read service information."
return
else:
data = response.read()
# Check that data returned is not an error object
if not assertJsonSuccess(data):
print "Error when reading service information. " + str(data)
else:
print "Service information read successfully. Now changing properties..."
# Deserialize response into Python object
dataObj = json.loads(data)
httpConn.close()
# Edit desired properties of the service
dataObj["minInstancesPerNode"] = minInstancesNum
dataObj["maxInstancesPerNode"] = maxInstancesNum
# Serialize back into JSON
updatedSvcJson = json.dumps(dataObj)
# Call the edit operation on the service. Pass in modified JSON.
editSvcURL = "/arcgis/admin/services/" + service + "/edit"
params = urllib.urlencode({'token': token, 'f': 'json', 'service': updatedSvcJson})
httpConn.request("POST", editSvcURL, params, headers)
# Read service edit response
editResponse = httpConn.getresponse()
if (editResponse.status != 200):
httpConn.close()
print "Error while executing edit."
return
else:
editData = editResponse.read()
# Check that data returned is not an error object
if not assertJsonSuccess(editData):
print "Error returned while editing service" + str(editData)
else:
print "Service edited successfully."
httpConn.close()
return
# 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"
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:]))