将嵌套字典传递给请求模块

时间:2018-01-10 17:49:07

标签: python django python-requests

我有一个嵌套字典,我希望将其传递给Web服务(用PHP编写)并且正在努力,因为我无法访问我需要的数据。

字典看起来像

import requests
from nested_dict import nested_dict

data = nested_dict()

data['name'] = 'test'

data['cookies']['PHPSESSID']['name'] = 'PHPSESSID'
data['cookies']['PHPSESSID']['essential'] = 'Essential'

data['cookies']['CookieNotice']['name'] = 'CookieNotice'
data['cookies']['CookieNotice']['essential'] = 'Essential'

然后我提出要求:

r = requests.post('someurl.com', data = data)

在接收网址someurl.com(用PHP编写)中,我可以访问第一级没问题,例如

header('Content-Type: application/json');
$data = $_REQUEST;
$response['content'] = $data['name'];
$response = $response['content'];
echo json_encode($response);

问题是尝试访问嵌套dict中的数据。当我遇到someurl.com时,我不知道它到达的是什么形式,因此我不能用它来产生循环。我想做的是:

header('Content-Type: application/json');
$data = $_REQUEST;
$response['content'] = $data['name'];
  foreach ($data['cookies'] as $k => $v):
  $response['content'] .= $k." ".$v;
endforeach;

$response = $response['content'];
echo json_encode($response);

当在模板中打印出响应时,嵌套部分会显示内容......

非常感谢任何帮助!

更新

我尝试了许多排列,但仍在苦苦挣扎!我只需要能够将嵌套的dict(或json)传递给我的接收URL' someurl.com'并能够(json)在PHP中解码,例如$ d = json_decode($ _ POST)

这个'工作'但我不能做'任何回应:

dat = json.dumps(data)
req = requests.get('someurl.com',params=dat)

尝试使用requests.post时,我无法做任何事情,如果我传递原始字典或将其转换为json。

非常感谢

2 个答案:

答案 0 :(得分:2)

对于Python请求模块,这很糟糕:

requests.post(url, data=nested_dict)

好:

requests.post(url, json=nested_dict)

注意:nested_dict不需要进行字符串化。只需将其作为字典传递即可。

答案 1 :(得分:1)

对我有用的解决方案如下:

import requests,json
from nested_dict import nested_dict

data = nested_dict()

data['name'] = 'test'

data['cookies']['PHPSESSID']['name'] = 'PHPSESSID'
data['cookies']['PHPSESSID']['essential'] = 'Essential'

data['cookies']['CookieNotice']['name'] = 'CookieNotice'
data['cookies']['CookieNotice']['essential'] = 'Essential'

datajson = json.dumps(data)

req = requests.post('someurl.com/myendpoint.php',data={'payload':datajson},timeout=3.00)

然后在someurl.com/myendpoint.php的PHP脚本中我可以使用$ _POST

$data = json_decode($_POST['payload']);