首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请求返回400,有效负载中包含JSON,有效负载中的字符串返回200

请求返回400,有效负载中包含JSON,有效负载中的字符串返回200
EN

Stack Overflow用户
提问于 2020-08-18 04:10:08
回答 1查看 37关注 0票数 0

使用在POST请求后返回嵌套JSON数据集的API。它期望有效负载为:

代码语言:javascript
复制
payload = '{"metrics":[ {"name":"Jobs.2019"}, {"name", "Jobs.2018"], "constraints": ["dimensionName": "Area", "map": {"Adams, OH":["39001"],"Allen, OH":["39003"]} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]} } ] }'

其中,{"Adams,OH":" 391001 "}将标签放在FIPS码391001上以供查找。问题是俄亥俄州有88个县,美国每个州都有更多的县。

我想我可以把这些县作为counties.json

代码语言:javascript
复制
{
   "Adams, OH":[
      "39001"
   ],
   "Allen, OH":[
      "39003"
   ]
}

并在我的脚本中设置变量

代码语言:javascript
复制
with open('data.json', 'r') as json_file:
    counties = json.load(json_file)

然后调用我的请求

代码语言:javascript
复制
metrics = '[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}]'

payload = f'{{"metrics": {metrics},  "constraints": [{{"dimensionName": "Area", "map": {counties} }}, {{"dimensionName": "Industry", "map": {{"Crop Production":["111000"]}}  ]}}'

result = requests.request("POST", url, headers=headers, data=payload)

但是,这将返回一个错误请求的<400>,我的有效负载如下所示:

代码语言:javascript
复制
{"metrics": [{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}],  "constraints": [{"dimensionName": "Area", "map": {'Adams, OH': ['39001'], 'Allen, OH': ['39003']} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]}  ]}

但是,当我调用它时:

代码语言:javascript
复制
metrics = '[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}]'

payload = '{"metrics":' + metrics + ',"constraints": [{"dimensionName": "Area", "map": {"Adams, OH":["39001"],"Allen, OH":["39003"]} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]} } ] }'

result = requests.request("POST", url, headers=headers, data=payload)

我收到一个负载如下的<200>:

代码语言:javascript
复制
{"metrics":[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}],"constraints": [{"dimensionName": "Area", "map": {"Adams, OH":["39001"],"Allen, OH":["39003"]} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]} } ] }

据我所见,一切都是完全相同的,解释器将JSON输出为单引号(')而不是双引号("),但根据我的记忆,请求模块接收相同的有效负载。

我觉得我错过了一些明目张胆的愚蠢和明显的东西,但在这一点上,我已经尝试了我的工具腰带中的每一个技巧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-18 04:56:44

问题是,当您读取JSON文件时,json.load会返回一个Python dict。然后,当您使用它作为f-string的输入时,您只是获得了该dict的Python表示,而不是一个有效的JSON对象-正如您已经注意到的,它被表示为单引号,这在JSON中是无效的- JSON对于单引号和双引号非常挑剔。

您可以使用json.dumps(counties)而不是counties

然而,我建议你做一些不同的事情。不需要操作字符串来创建JSON对象,而是在Python中完成这项工作,然后根据需要转换为JSON。这就是json库为您提供的帮助!

例如,您可以执行以下操作,这要简单得多:

代码语言:javascript
复制
metrics = json.loads('[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}]')

payload = {"metrics": metrics,
           "constraints": [{"dimensionName": "Area",
                            "map": counties},
                           {"dimensionName": "Industry",
                            "map": {"Crop Production": ["111000"]}}]}

result = requests.post(url, headers=headers, json=payload)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63457949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档