Python — PHP curl меняет JSON перед публикацией

У меня есть API, написанный на django, который может правильно обработать следующий запрос.

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'

Если я распечатываю request.DATA на стороне Django, я получаю следующее:

(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 содержит {«name»: «a», «description»: «b», «props»: {«Notes»: «c»}}.

Когда этот запрос попадает в бэкэнд, я получаю следующее:

(Pdb) print request.DATA
<QueryDict: {u'{"name":"a","description":"b","props":{"Notes":"c"}}': [u'']}>

Что PHP делает с моим JSON перед отправкой? Как я могу опубликовать те же данные с использованием PHP, как указано в моем запросе curl выше?

  • Это работает для запросов, которые не имеют вложенного JSON

0

Решение

Я не эксперт по PHP, но это может не иметь значения: если request.DATA это QueryDictВы можете просто использовать arealdict = request.DATA.dict() чтобы получить реальный dict из этого. Если будут какие-либо повторяющиеся поля, это выберет только одно из их нескольких значений, но это не должно иметь значения для вашего конкретного случая использования, так как, похоже, в любом случае нет повторяющихся полей.

0

Другие решения

Оказывается, позже я переписывал заголовок application / json в своем коде входа. Вот почему некоторые запросы работали нормально.

Тип контента Sinc eteh не был задан, Django рассматривал запрос как форму сообщения, которое привело к искаженному запросу. ДАННЫЕ.

0

По вопросам рекламы [email protected]