【问题标题】:Can't post iterated list of dictionaries to api endpoint, only first dictionary in list is sent无法将迭代的字典列表发布到 api 端点,只发送列表中的第一个字典
【发布时间】:2019-07-23 22:59:33
【问题描述】:

我创建了一个简短的脚本,它将从 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 名。身体的输出是这样的:

[{'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 个?

【问题讨论】:

  • 我认为最后一部分并不意味着是 for 循环的一部分。
  • 它不起作用,所以我在 for 循环中尝试,但如果我现在使用员工变量,我只能发送任何员工数据集

标签: python python-2.7 api python-requests


【解决方案1】:

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

【讨论】:

  • 在 for 循环之外的 post 请求不会发送任何内容。如果我使用只发送一个员工数据集的员工变量,我只能让它发送任何东西。
【解决方案2】:

所以这段代码确实有效:

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('buddypunch.azure-api.net')
    conn.request("POST", "/employee/?%s" % params, json.dumps(employee), headers)
    response = conn.getresponse()
    data = json.dumps(response.read())
    conn.close()

问题是缺少唯一的用户名。但我想我会把它留给那些遇到 API 不接受列表的类似问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多