我有一个用django编写的API,它能够正确处理以下请求。
curl -H "Content-Type: application/json" -d '{"name":"a","description":"b","props": {"Notes":"c"}}' http://127.0.0.1:8000/en/api/asset/ -H 'Authorization: Token 114ada7e487b2cdbc9277d377e4d20640a606bb2'
如果我在Django端打印request.DATA,我会得到以下内容:
(Pdb) print request.DATA
{u'props': {u'Notes': u'c'}, u'name': u'a', u'description': u'b'}
我有以下一段PHP代码,我想用它来完成相同的请求
$data_string = json_encode($values['json_parameters']);
error_log($data_string, 0);
//curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
error_log("Method: ".$method, 0);
if ($method == 'POST') {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
}
$ data_string包含{"名称":" a","描述":" b","道具&#34 ;:{"注释":" C"}}
当此查询到达后端时,我得到以下内容:
(Pdb) print request.DATA
<QueryDict: {u'{"name":"a","description":"b","props":{"Notes":"c"}}': [u'']}>
PHP在发送之前对我的JSON做了什么?如何根据我上面的curl请求使用PHP发布完全相同的数据?
答案 0 :(得分:0)
我没有PHP专家,但可能无关紧要:如果request.DATA
是QueryDict
,您只需使用arealdict = request.DATA.dict()
即可获得真实dict
出来的。如果有任何重复的字段,这将只选择其中一个值,但这对于您的特定用例并不重要,因为它似乎没有重复的字段。
答案 1 :(得分:0)
事实证明我之后在登录代码中覆盖了application / json标头。这就是为什么有些请求似乎工作正常。
未设置Sinc eteh内容类型,Django将请求视为表单帖子,导致了错误的request.DATA。