Получение ошибки HTTP POST: {«причина»: null, «ошибка»: «Запрос объекта JSON для вставки не может быть нулевым».}

#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)