2015-06-22 129 views
0

我正在处理一个项目,在该项目中,我必须从链接中获取数据,然后在从提取的数据中提取需要的信息后,将数据发布到另一个服务器中。我使用我的GET和POST图书馆的请求,而这里的提取所需要的数据的代码:使用Python中的请求在JSON中进行GET和POST 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 =数据和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) 
+2

你能否使其更加清晰?如果可能的话,添加示例GET/POST请求。 – LittleQ

+0

我会做那个老板。 –

回答

0

你是问如何从字典中的关键? 如果是这样,请使用语法

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) 
+0

不,我已经有了一个删除键的函数,但是我所问的是之后要做什么。 –

+1

好的,很酷。我想我明白你的意思。我正在更新答案。 – JonDeen

+1

设备是一个_dict_对象,你不需要'devices [i] = device' – LittleQ

1
作为

我评论,devices不是无效的输入(尽管一个有效的JSON)。根据艾哈迈德·艾哈达德的回复,我们应该发送{}格式的数据。

如果意味着从devices中删除'model'并发送更新后的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) 

否则就要在devices单独发送device

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

正如@JonDeen提到的,你应该阅读文件欲了解详细内容

+0

是的。在这种情况下,我可能会将它们作为字典或字典列表一次发送。我试图一次发送它们的原因是因为我担心由于超时或网络不稳定等原因,我会丢失一些数据。在这种情况下,我有2个“设备”,但如果我有更多的丢失机会发送它们时的数据更高。但看起来这是不可能的,我可能需要联系管理员。接收器是在PHP中,但我不知道它,所以我不知道我应该对管理员说什么?他怎么解决它?他正在接收json中的数据,如我的发布请求中所示。 –

+0

@ AhmedAl-haddad使用'keep-alive'发送请求,检查响应并发送相同的json,直到成功 – LittleQ