【问题标题】:Python request.post Not Accepting DictionaryPython request.post 不接受字典
【发布时间】:2016-02-04 21:48:07
【问题描述】:

这是我要发布的数据,

这是字典答案的印刷版:

{'Emails': set([u'vernon.fadel@denesik.com', u'helyn67@cruickshankmckenzie.com', u'tryan@fishercremin.com', u'cecilia.kerluke@gmail.com', u'sonia.ruecker@schmidt.info', u'reichel.tamatha@gmail.com', u'johntyree69@greendale.edu', u'gail34@reichel.com', u'birdman@quitzon.net ', u'onolan@gmail.com', u'lindgren.merry@howe.com', u'wilderman.nyree@heidenreich.com', u'yschneider@jacobson.biz', u'nakia.larkin@gmail.com', u'vblanda@gmail.com', u'pkoch@yahoo.com', u'ygoyette@yahoo.com', u'wiegand.lynnette@beer.com', u'ubradtke@hotmail.com', u'troy67@yahoo.com', u'eileen.gusikowski@oreilly.info', u'glubowitz@yahoo.com', u'inolan@hotmail.com', u'lfranecki@hotmail.com', u'miller.hana@gmail.com', u'morissette.lalla@kuhicmuller.com', u'harber.gisele@gmail.com', u'odalys.dubuque@ebertrunte.net', u'jones.kyree@auer.net', u'adams77@yahoo.com', u'parisian.linda@hotmail.com', u'channing.cremin@toy.org', u'chad.armstrong@yahoo.com', u'isaac.nolan@hotmail.com', u'kozey.luciana@collins.biz', u'cstehr@keebler.com', u'jquitzon@gmail.com', u'hhirthe@yahoo.com', u'emilia16@block.com', u'arice@greenholtconsidine.com', u'tobin.schuppe@gmail.com', u'wyman.junious@gmail.com', u'mrath@ruecker.com ', u' johns.sonji@lakinwalker.info', u'thiel.cassie@hodkiewicz.info', u'fjaskolski@hotmail.com', u'mosciski.destany@hotmail.com', u'vrippin@gmail.com', u'zschuppe@hotmail.com', u'clotilda26@goodwinlind.info', u'lizette.walker@stanton.com', u'hettinger.kamari@hotmail.com', u'emelia54@yahoo.com', u'terry.ezekiel@hotmail.com', u'douglyass.dickinson@hotmail.com', u'zulauf.olympia@gmail.com', u'maxxx.waters@sauer.biz', u'abshire.charmaine@schusterlabadie.com', u'kuvalis.dewitt@wolfschaefer.com', u"elberta.o'connell@yahoo.com", u'henery76@yahoo.com', u'britny60@gmail.com', u'ed.hilpert@hansen.com', u'burnice.feest@yahoo.com', u' ybartoletti@littel.biz', u'sharde.murazik@hotmail.com', u'angelica.klocko@ankunding', u'brandi.klein@hotmail.com', u'dollie49@hotmail.com', u'mrath@ruecker.com', u'hayley27@koelpin.com', u'georgiann.mertz@moen.net', u'floretta39@volkmanrosenbaum.net', u'vicy.predovic@gmail.com', u'raven53@yahoo.com', u'fmann@yahoo.com', u'sdaugherty@gmail.com', u'gerlach.villa@koelpinfeeney.net', u'alysha.gibson@hotmail.com', u'hoy.kozey@gmail.com', u'cheyenne84@lehneroconner.com', u'uoberbrunner@hotmail.com', u'hhaag@swaniawskiterry.info', u'infant80@yahoo.com', u'manilla.west@hotmail.com', u'hconsidine@bernhardhills.info', u'dean94@hotmail.com', u'bahringer.karl@yahoo.com', u'crona.meredith@gmail.com', u'letta.larkin@quitzon.net', u'owindler@strosin.info', u'shanahan.anders@yahoo.com', u'mclaughlin.desi@gmail.com', u'erdman.icy@hotmail.com', u'salvatore21@hintz.com', u'jkoch@hotmail.com', u'red.beatty@yahoo.com', u'helma91@hotmail.com', u'arland.koepp@hotmail.com', u'ymoore@cristhalvorson.org', u'woodie.crooks@kozey.com', None, u'jchamplin@hotmail.com ', u'walter.elwyn@yahoo.com']), '# of Emails per Domain': {u'@hotmail.com': 22, u'@yahoo.com': 18, u'@gmail.com': 18}, 'April Users': 70}

当我跑步时:

 r = requests.post('https://9g9xhayrh5.execute-api.us-west-2.amazonaws.com/test/data', data = answers)

我收到此错误:

{"message": "Could not parse request body into json: Unrecognized token \'Emails\': was expecting (\'true\', \'false\' or \'null\')\n at [Source: [B@311a7237; line: 1, column: 8]"}

完全不知道这是什么意思,我试过把数据解析成json,为什么不像'Email'字符串?

如果我添加我得到的 json.dump 代码:

TypeError

TypeError: set([u'vernon.fadel@denesik.com', u'helyn67@cruickshankmckenzie.com', u'tryan@fishercremin.com', u'cecilia.kerluke@gmail.com', u'sonia.ruecker@schmidt.info', u'reichel.tamatha@gmail.com', u'johntyree69@greendale.edu', u'gail34@reichel.com', u'birdman@quitzon.net ', u'onolan@gmail.com', u'lindgren.merry@howe.com', u'wilderman.nyree@heidenreich.com', u'yschneider@jacobson.biz', u'nakia.larkin@gmail.com', u'vblanda@gmail.com', u'pkoch@yahoo.com', u'ygoyette@yahoo.com', u'wiegand.lynnette@beer.com', u'ubradtke@hotmail.com', u'troy67@yahoo.com', u'eileen.gusikowski@oreilly.info', u'glubowitz@yahoo.com', u'inolan@hotmail.com', u'lfranecki@hotmail.com', u'miller.hana@gmail.com', u'morissette.lalla@kuhicmuller.com', u'harber.gisele@gmail.com', u'odalys.dubuque@ebertrunte.net', u'jones.kyree@auer.net', u'adams77@yahoo.com', u'parisian.linda@hotmail.com', u'channing.cremin@toy.org', u'chad.armstrong@yahoo.com', u'isaac.nolan@hotmail.com', u'kozey.luciana@collins.biz', u'cstehr@keebler.com', u'jquitzon@gmail.com', u'hhirthe@yahoo.com', u'emilia16@block.com', u'arice@greenholtconsidine.com', u'tobin.schuppe@gmail.com', u'wyman.junious@gmail.com', u'mrath@ruecker.com ', u' johns.sonji@lakinwalker.info', u'thiel.cassie@hodkiewicz.info', u'fjaskolski@hotmail.com', u'mosciski.destany@hotmail.com', u'vrippin@gmail.com', u'zschuppe@hotmail.com', u'clotilda26@goodwinlind.info', u'lizette.walker@stanton.com', u'hettinger.kamari@hotmail.com', u'emelia54@yahoo.com', u'terry.ezekiel@hotmail.com', u'douglyass.dickinson@hotmail.com', u'zulauf.olympia@gmail.com', u'maxxx.waters@sauer.biz', u'abshire.charmaine@schusterlabadie.com', u'kuvalis.dewitt@wolfschaefer.com', u"elberta.o'connell@yahoo.com", u'henery76@yahoo.com', u'britny60@gmail.com', u'ed.hilpert@hansen.com', u'burnice.feest@yahoo.com', u' ybartoletti@littel.biz', u'sharde.murazik@hotmail.com', u'angelica.klocko@ankunding', u'brandi.klein@hotmail.com', u'dollie49@hotmail.com', u'mrath@ruecker.com', u'hayley27@koelpin.com', u'georgiann.mertz@moen.net', u'floretta39@volkmanrosenbaum.net', u'vicy.predovic@gmail.com', u'raven53@yahoo.com', u'fmann@yahoo.com', u'sdaugherty@gmail.com', u'gerlach.villa@koelpinfeeney.net', u'alysha.gibson@hotmail.com', u'hoy.kozey@gmail.com', u'cheyenne84@lehneroconner.com', u'uoberbrunner@hotmail.com', u'hhaag@swaniawskiterry.info', u'infant80@yahoo.com', u'manilla.west@hotmail.com', u'hconsidine@bernhardhills.info', u'dean94@hotmail.com', u'bahringer.karl@yahoo.com', u'crona.meredith@gmail.com', u'letta.larkin@quitzon.net', u'owindler@strosin.info', u'shanahan.anders@yahoo.com', u'mclaughlin.desi@gmail.com', u'erdman.icy@hotmail.com', u'salvatore21@hintz.com', u'jkoch@hotmail.com', u'red.beatty@yahoo.com', u'helma91@hotmail.com', u'arland.koepp@hotmail.com', u'ymoore@cristhalvorson.org', u'woodie.crooks@kozey.com', None, u'jchamplin@hotmail.com ', u'walter.elwyn@yahoo.com']) is not JSON serializable

【问题讨论】:

  • JSON 不知道 set。另外,您绝对不应该在此处发布这些电子邮件地址。
  • 我假设这些是假的,但好电话
  • 试试answers['Emails'] = list(answers['Emails'])
  • 同样的错误无法识别令牌'电子邮件'
  • 抱歉,我错了,但我现在解决了:如果您自己对 JSON 进行编码并将 requests.post 一个 JSON 编码的字符串作为 data 参数传递,它就可以工作。

标签: python api request


【解决方案1】:

这行得通:

import requests
import json
answers = {} #...
url = "..."
answers['Emails'] = list(answers['Emails'])
r = requests.post(url, data=json.dumps(answers))

另一种方式不起作用的原因是,默认情况下,请求使用 Content-Type application/x-www-form-urlencoded 而不是 JSON 发送数据。

要改变这一点,您也可以使用json 代替data 参数:

r = requests.post(url, json=answers)

要使用 requests 库调试代码,您可以在发送之前look at a prepared request

【讨论】:

    【解决方案2】:

    TypeError: set([ ... ]) is not JSON serializable

    集合不是 JSON 可序列化的。您可以将所有集合转换为字典中的列表:

    answers = {key: list(value) if isinstance(value, set) else value
               for key, value in answers.items()}
    

    (请注意,这不适用于嵌套字典)。

    或者,使用处理集合序列化的custom JSON encoder


    使用json 转储和加载它通常有助于调试:

    import json
    
    answers = json.loads(json.dumps(answers))
    r = requests.post('https://9g9xhayrh5.execute-api.us-west-2.amazonaws.com/test/data', data=answers)
    

    【讨论】:

    • 好建议,我试过那个方法,但我得到一个 TypeError
    • @AdamWeitzman 请发布回溯,这可能会让我们知道发生了什么。谢谢!
    • @AdamWeitzman 是的,确切地说,更新了答案。希望对您有所帮助。
    • hmmm 尝试手动操作但没有成功,我会尝试 JSON 编码
    • @AdamWeitzman 是的,因为您在字典中有其他集合,更新了第一个选项。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2018-05-17
    • 2020-08-08
    相关资源
    最近更新 更多