2016-02-02 3 views
5

Я пытаюсь создать сценарий питона, который делает следующее:Python отправить массив JSON с помощью POST

  • Разбор CSV файл
  • Отправить файл CSV на удаленный сервер с помощью REST API

Код, который у меня есть, предназначен для анализа файла CSV и преобразования его в объект JSON.

Однако при импорте на удаленный сервер записывается только первая строка.

Вопрос: Нужно ли мне перебирать и отправлять ОТДЕЛЬНЫЙ http-запрос для КАЖДОЙ ROW? Я чувствую, что это было бы слишком громоздким. Мой CSV-файл имеет более 10 000 строк, и это будет работать в ежедневном cron.

Вопрос: Как я могу настроить это для импорта всех строк в одном запросе?

#Requests package for python import requests 
import csv 
import json 
import requests 

#Parse CSV file and convert to JSON 

f = open('example_import_csv.csv', 'rU') 
reader = csv.DictReader(f, fieldnames = ("u_date","u_product","u_serial_number")) 
out = json.dumps([row for row in reader]) 
#Print output confirms that the JSON is formatted properly 
print(">JSON" , out) 

#Set request parameters 
url = 'xxxxx' 
user = 'xxxxxx' 
pwd = 'xxxxxx' 

#Set proper headers 
headers = {"Content-Type":"application/json","Accept":"application/json"} 

#data=out contains the JSON object 
#Problem is only the first row is imported 
response = requests.post(url, auth=(user, pwd), headers=headers ,data=out) 

#Check for HTTP codes other than 200 
if response.status_code != 200: 
    print('Status:', response.status_code, 'Headers:', response.headers) 
    exit() 

#Decode the JSON response into a dictionary and use the data 
print('Status:',response.status_code,'Headers:',response.headers,'Response:',response.json()) 


### OUTPUT 

# >JSON [{"u_serial_number": "11", "u_product": "Apples", "u_date": "1/12/15"}, {"u_serial_number": "12", "u_product": "Pears", "u_date": "1/29/15"}, {"u_serial_number": "13", "u_product": "Oranges", "u_date": "1/12/15"}, {"u_serial_number": "14", "u_product": "Blackberries", "u_date": "1/29/15"}, {"u_serial_number": "15", "u_product": "Blueberries", "u_date": "2/5/15"}, {"u_serial_number": "16", "u_product": "Bananas", "u_date": "2/7/15"}, {"u_serial_number": "17", "u_product": "Strawberries", "u_date": "2/7/15"}] 

# Status: 201 Headers: {'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked', 'Content-Type': 'application/json'} 

EDIT: Я отправляю данные в наш экземпляр ServiceNow. Вот статья wiki, в которой описывается шаблон скрипта python.

http://wiki.servicenow.com/index.php?title=Table_API_Python_Examples#gsc.tab=0

Вот основной блок кода, который я использовал в качестве шаблона. Обратите внимание, что это работает для одной строки данных в соответствии с примером, но do not не работает при импорте нескольких строк данных.

#Need to install requests package for python 
#sudo easy_install requests 
import requests 

# Set the request parameters 
url = 'https://myinstance.service-now.com/api/now/table/incident' 
user = 'xxxxxxx' 
pwd = 'xxxxxxx' 

# 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"}') 

# Check for HTTP codes other than 200 
if response.status_code != 201: 
    print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:',response.json()) 
    exit() 
+3

Несомненно, проблема в том, что обрабатывает сообщение на удаленном сервере? –

+0

Спасибо, Дэниэл. Я думаю, вы на что-то здесь. Я проверил это, используя REST API Explorer (графический интерфейс для генерации запросов) в ServiceNow. Разумеется, только одна из записей прошла. Я думаю, что может быть ограничение в ServiceNow, где он может принимать только одну запись за запрос. Я опубликую в разделе конкретного поставщика. – pengz

ответ

0

Я подтвердил, что API ServiceNow REST может разрешать только одну запись за запрос.

http://wiki.servicenow.com/index.php?title=Table_API#POST_.2Fapi.2Fnow.2Fv1.2Ftable.2F.28tableName.29

Я переключился на API JSONv2 для вставки нескольких записей. http://wiki.servicenow.com/index.php?title=JSONv2_Web_Service#insert

Спасибо Даниэлю, который помог мне в правильном направлении с моим устранением неполадок.