Python通过POST方式发送JSON数组

6
我正在尝试创建一个Python脚本,它可以执行以下操作:
  • 解析CSV文件
  • 通过REST API将CSV文件发送到远程服务器
我已经编写了代码来解析CSV文件并将其转换为JSON对象。
然而,当它导入到远程服务器时,只有第一行被写入。
问题:我需要循环遍历并为每一行发送单独的HTTP请求吗?我觉得这会非常麻烦。我的CSV文件有超过10,000行,这将在每天的定时任务中运行。
问题:如何设置它以在单个请求中导入所有行?
#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'}

编辑:我正在将数据发送到我们的ServiceNow实例。以下是描述Python脚本模板的维基文章。

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

这是我用作模板的基本代码块。请注意,此代码块适用于单行数据,如示例所示,但在导入多行数据时无法使用。

#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
问题肯定出在处理远程服务器上的帖子的程序中,对吧? - Daniel Roseman
谢谢Daniel。我认为你在这方面有所发现。我通过在ServiceNow中使用REST API Explorer(一个生成请求的图形化界面)进行了测试。果然,只有一个记录被传递了。我认为ServiceNow可能存在一种限制,即每个请求只能接受一个记录。我将在供应商特定部分发布。 - pengz
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接