PHP curl在发布之前正在改变JSON

时间:2015-01-14 21:44:26

标签: php python django curl

我有一个用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发布完全相同的数据?

  • 它适用于没有嵌套JSON的请求

2 个答案:

答案 0 :(得分:0)

我没有PHP专家,但可能无关紧要:如果request.DATAQueryDict,您只需使用arealdict = request.DATA.dict()即可获得真实dict出来的。如果有任何重复的字段,这将只选择其中一个值,但这对于您的特定用例并不重要,因为它似乎没有重复的字段。

答案 1 :(得分:0)

事实证明我之后在登录代码中覆盖了application / json标头。这就是为什么有些请求似乎工作正常。

未设置Sinc eteh内容类型,Django将请求视为表单帖子,导致了错误的request.DATA。