#python #rest #post #servicenow
#python #остальное #Публикация #servicenow
Вопрос:
Я получаю ошибку HTTP POST, когда пытаюсь подключиться к экземпляру Service Now для автоматизации запросов на изменение с помощью Python. Вот скрипт, который я использую с Python 3.4.4
# SNOW CR AUTOMATION SCRIPT
import requests
import json
# put the ip address or dns of your SNOW API in this url
url = 'http://<>/change_request.do?JSONv2amp;sysparm_action=insert'
data= {
'short_description': '<value>',
'priority': '<value>',
'reason': '<value>',
'u_reason_for_change': '<value>',
'u_business_driver': '<value>',
'u_plan_of_record_id': '<value>'
}
print ("Data Inserted :")
print (data)
#Content type must be included in the header
header = {"Authorization":"Basic V1NfRVRPX1ROOkBiY2RlNTQzMjE=","Content- Type":"application/json"}
#Performs a POST on the specified url.
response = requests.request('POST', url, auth=("<value>","<value>"), json=data, headers=header)
print ( " Header is : ")
print (response.headers)
print (" ")
print ( "HTTP Response is :" )
print (response)
print (" ")
print ("***********************")
print (" Output : ")
print ( response.text)
Я получаю ошибку, как показано ниже, при запуске вышеупомянутого скрипта.
Output :
{"reason":null,"error":"Request JSON object for insert cannot be null."}
Я не уверен, почему возникает эта ошибка. Кто-нибудь, пожалуйста, может помочь в этом?
Ответ №1:
Это рабочий пример, который я тестировал на своем экземпляре. Я использую REST Table API для вставки запроса на изменение. Это неправда, что это не может быть http. Это любой протокол, который ваш экземпляр позволяет подключать, скажем, из браузера.
#Need to install requests package for python
#easy_install requests
import requests
# Set the request parameters
url = '<yourinstance base url>/api/now/table/change_request'
user = <username>
pwd = <password>
# Set proper headers
headers = {"Content-Type":"application/json","Accept":"application/json"}
# Do the HTTP request
response = requests.post(url, auth=(user, pwd), headers=headers ,data="{"short_description":"test in python"}")
# Check for HTTP codes other than 201
if response.status_code != 201:
print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:',response.json())
exit()
# Decode the JSON response into a dictionary and use the data
data = response.json()
print(data)
Ответ №2:
Я думаю, вам следует использовать SSL, поэтому нет http! Первая ошибка, которую я вижу в вашем скрипте, заключается в том, как вы передаете свою полезную нагрузку, вам нужно преобразовать свой словарь в объект / строку JSON. И вам не нужно проходить проверку подлинности дважды, у вас есть базовая http-аутентификация, обрабатываемая requests.post, поэтому в заголовке нет необходимости.
С этим скриптом он должен работать:
import json
import requests
url = 'https://instancename.service-now.com/change_request.do?JSONv2'
user = 'admin'
pwd = 'admin'
# Set proper headers
headers = {"Content-Type":"application/json","Accept":"application/json"}
payload = {
'sysparm_action': 'insert',
'short_description': 'test_jsonv2',
'priority': '1'
}
# Do the HTTP request
response = requests.post(url, auth=(user, pwd), headers=headers, data=json.dumps(payload))
# Check for HTTP codes other than 200
if response.status_code != 200:
print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:',response.json())
exit()
# Decode the JSON response into a dictionary and use the data
data = response.json()
print(data)