Próbuję utworzyć skrypt Pythona, który wykonuje następujące czynności:Python wysłać tablicę JSON poprzez POST
- Przetwarza plik CSV
- Wyślij plik CSV do zdalnego serwera za pośrednictwem REST API
Kod, który mam działa, aby przetworzyć plik CSV i przekonwertować go na obiekt JSON.
Jednak podczas importowania do serwera zdalnego zapisywany jest tylko pierwszy wiersz.
Pytanie: Czy muszę wykonać pętlę i wysłać żądanie SEPARATE http dla KAŻDEGO WIERSZA? Czuję, że to byłoby zbyt kłopotliwe. Mój plik CSV ma ponad 10 000 wierszy i będzie działać na cronie.
Pytanie: Jak mogę to ustawić, aby zaimportować wszystkie wiersze w jednym żądaniu?
#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'}
EDYCJA: Wysyłam dane do naszego wystąpienia ServiceNow. Oto artykuł wiki, który opisuje szablon skryptu Pythona.
http://wiki.servicenow.com/index.php?title=Table_API_Python_Examples#gsc.tab=0
Oto podstawowy blok kodu, który kiedyś jako szablon. Zauważ, że działa to dla pojedynczego wiersza danych, jak na przykładzie, ale nie działa przy importowaniu wielu wierszy danych.
#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()
Na pewno jest problem z tym, co przetwarza post na serwerze zdalnym? –
Dzięki Daniel. Myślę, że jesteś tutaj. Przetestowałem to za pomocą Eksploratora interfejsu REST (graficzny interfejs użytkownika do generowania żądań) w ServiceNow. Rzeczywiście, przeszła tylko jedna z zapisków. Myślę, że może istnieć ograniczenie w ServiceNow, gdzie może zaakceptować tylko jeden rekord na żądanie. Będę publikować w sekcji dotyczącej konkretnego dostawcy. – pengz