首页 > 解决方案 > 无法将迭代的字典列表发布到 api 端点,只发送列表中的第一个字典

问题描述

我创建了一个简短的脚本,它将从 excel 文件中提取数据,将该数据放入字典中,最终目标是将每个生成的字典发布到我正在使用的 API 中。但无论我做什么,我只能得到要发送的 excel 表中的第一个条目。我在这里想念什么?

我尝试过按正文索引发布,但它说任何高于索引 0 的内容都超出范围,除非我根据索引打印,我可以拉出其中任何一个,并且它们显然存在于 body 变量中。我也尝试通过“员工”变量发布,但它只发布第一组数据。

body = []

for r in range(1, worksheet.nrows):
    fname = worksheet.cell(r,0).value
    lname = worksheet.cell(r,1).value
    email = worksheet.cell(r,2).value
    username = worksheet.cell(r,3).value
    empid = int(worksheet.cell(r,4).value)
    employee = {
    "Username": username,
    "FirstName": fname,
    "LastName": lname,
    "Email": email,
    "EmployeeID": int(empid),
    "IsActive": "true"
    }
    body.append(employee)

    conn = httplib.HTTPSConnection('api-endpoint.com')
    conn.request("POST", "/employee/?%s" % params, json.dumps(body), headers)
    response = conn.getresponse()
    data = json.dumps(response.read())
    conn.close()

我不确定这里发生了什么,因为如果我打印正文,我会得到一个字典列表,每个字典都包含正确的员工数据,但是当将它们放入发布请求时,我要么只得到第一个员工被发送到端点,要么没有。

编辑:API 终于回到了我的身边,除了员工列表之外,端点不会,所以发布请求必须在 for 循环中。

我的代码现在看起来像这样:

body = []

for r in range(1, worksheet.nrows):
    fname = worksheet.cell(r,0).value
    lname = worksheet.cell(r,1).value
    email = worksheet.cell(r,2).value
    username = worksheet.cell(r,3).value
    empid = int(worksheet.cell(r,4).value)
    employee = {
    "Username": username,
    "FirstName": fname,
    "LastName": lname,
    "Email": email,
    "EmployeeID": int(empid),
    "IsActive": "true"
    }
    body.append(employee)
    for i in body:
        conn = httplib.HTTPSConnection('buddypunch.azure-api.net')
        conn.request("POST", "/employee/?%s" % params, json.dumps(employee), headers)
        response = conn.getresponse()
        data = json.dumps(response.read())
        conn.close()

我的 Excel 表中有 3 名员工,但只发布了 2 名。body 的输出如下所示:

[{'Email': u'jim@email.com',
  'EmployeeID': 80110,
  'FirstName': u'Jim',
  'IsActive': 'true',
  'LastName': u'Halpert',
  'Username': u'JimH'},
 {'Email': u'don@email.com',
  'EmployeeID': 80111,
  'FirstName': u'Don',
  'IsActive': 'true',
  'LastName': u'Julio',
  'Username': u'DonJ'},
 {'Email': u'toolman@email.com',
  'EmployeeID': 80112,
  'FirstName': u'Tim',
  'IsActive': 'true',
  'LastName': u'Toolman',
  'Username': u'TimT'}]

那么为什么循环只访问和发布 3 个中的 2 个呢?

标签: pythonpython-2.7apipython-requests

解决方案


您正在 for 循环中执行您的 post 请求,将其移到循环之外,以便它接收完全填充的列表


推荐阅读