【问题标题】:GET and POST in JSON using requests in Python使用 Python 中的请求在 JSON 中进行 GET 和 POST
【发布时间】:2015-06-22 06:40:47
【问题描述】:

我正在从事一个项目,我必须从链接获取数据,然后在从获取的数据中提取所需的信息后将数据发布到另一台服务器。我正在为我的 GET 和 POST 使用库请求,这是提取所需数据的代码:

    ''' original data fetched
     result= {"version": "1.0","cmd":"list_metering","status":"success","devices":
     [{"deviceid":"xxxxx","model":"xxxx"},{"deviceid":"xxxxx","model":"xxxx"}]} '''

for devices in result['devices']:


    # delete the parameters I don't need
    final_data = removekey(devices,'model')

    # x.update(final_data) -> Trying dicts
    # x.append(final_data) -> Trying lists

    # Sending directly 
    resp = requests.post(url,json=final_data,headers=headers)

    no+=1
    if no== len(result['devices']):
        break

我将在这里调用一个函数,该函数将删除不需要的键,然后我将把其余的键发布出来。

我尝试对字典使用 update() 函数,但它不起作用,因为我有相同的键,所以只会考虑其中一个数据。列表有效,但我会以这种形式获取数据:

[{"deviceid":"xxxxx","model":"xxxx"},{"deviceid":"xxxxx","model":"xxxx"}]

我尝试使用 json=data 和 x.json() 但两者都不适用于列表。但是,如果我直接发送数据,如我的第一个代码中所示,由于延迟,我不太确定还有什么,如果我幸运的话,将发送完整数据,否则我会不断丢失部分获取的数据.

在这种情况下,我如何在 json 中获取数据,然后在 json 中再次发送回来?我的目标是将数据作为一个捆绑包发送,所有设备一起发送,这样我就不会丢失任何东西。

这是我正在使用的 GET 和 POST:

 # GET 
url_source = 'https://website'
url = requests.get(url_source)
result = url.json()

 # POST 
headers = {'charset':'utf-8','Content-Type':'application/json'}
url = "http://xxxx/_get_v1.php"
data = final_data
resp = requests.post(url,json=data,headers=headers)

【问题讨论】:

  • 你能说得更清楚一点吗?如果可能,添加示例 GET/POST 请求。
  • 我会做那个老板。

标签: python json api for-loop


【解决方案1】:

正如我所评论的,devices 不是无效输入(尽管是有效的 json)。根据@AhmedAl-haddad 的回复,我们应该发送{}-formatted 数据。

如果这意味着从 devices 中删除“模型”并发送更新后的 GET 响应数据,如下所示。

# POST
headers = {'charset':'utf-8','Content-Type':'application/json'}
url = "http://xxxx/_get_v1.php"

# remove 'models'
map(lambda x: x.pop('model'), result['devices'])

# send result
resp = requests.post(url,json=result,headers=headers) 

或者我们需要单独发送devicedevices

# send result  
for device in result['devices']:
    resp = requests.post(url,json=device,headers=headers)

正如@JonDeen 所说,您应该阅读文档以获取更多详细信息

【讨论】:

  • 是的。在这种情况下,我可能会一次将它们作为字典列表或字典发送。我试图一次发送它们的原因是因为我担心由于超时或网络不稳定等原因而丢失一些发送的数据。在这种情况下,我有 2 个“设备”,但如果我有更多,那么丢失的机会发送它们时的数据更高。但似乎不可能,我可能需要联系管理员。接收器在 php 中,但我不知道,所以我不确定我应该对管理员说什么?他该如何解决?如我的发布请求所示,他正在接收 json 格式的数据。
  • @AhmedAl-haddad 使用 'keep-alive' 发送请求,检查响应并发送相同的 json 直到成功
【解决方案2】:

您是在问如何从字典中删除键? 如果是这样,请使用语法

 del myJson["myKey"]

如果您想操作数据集并从列表和字符串重组它,还可以考虑使用json-API 来简化。

还要检查Requests documentation,例如在提交 json 时。

示例(已更新以删除不必要的列表更新):

devices=result['devices']
for i,device in enumerate(devices):

    # delete the parameters I don't need
    del device['model']

resp = requests.post(url,json=devices,headers=headers)

【讨论】:

  • 设备是一个dict对象,你不需要devices[i]=device
  • 对不起,我可能有点困惑,但 device 不是 dictdevices 不是 list
  • @AhmedAl-haddad 我猜您将devicesresult 隔离开来,这是一个列表,使其成为无效的Json。您应该在 result 中替换 devices
  • @JonDeen(设备是 dict 列表:)@AhmedAI-haddad 发布 requests.post(url,json=result,headers=headers),它会起作用。
  • @AhmedAl-haddad - 在发送 json 数据时,即使服务器不一定喜欢 json 的内容,服务器也能够生成状态 json-message,这在技术上使其有效网页响应 (200)。我不熟悉与requests.post 相关的json-argument,但请尝试使用带有json 字符串化数据的data-argument,如我链接到的请求文档中所述。在不确切知道服务器请求的字段/格式的情况下,我们不可能知道如何正确格式化您的 json,在这种情况下您应该联系管理员。
猜你喜欢
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多