PHP не получает все данные из python запросов - PullRequest
0 голосов
/ 14 марта 2020

Мой php файл выглядит следующим образом:

<?php
var_dump($_POST);

Python код:

>>> import requests
>>> data = {'test1': 'ok', 'test2': ['Ok','or','wrong']}
>>> print(requests.post('http://localhost:8000/test.php', data=data).text)
array(2) {
  ["test1"]=>
  string(2) "ok"
  ["test2"]=>
  string(5) "wrong"
}
>>> data = {'test1': 'ok', 'test2': {'w1': 'Ok', 'w2': 'or', 'w3': 'wrong'}}
>>> print(requests.post('http://localhost:8000/test.php', data=data).text)
array(2) {
  ["test1"]=>
  string(2) "ok"
  ["test2"]=>
  string(2) "w3"
}

requests отправляет только последний элемент списков или словарей в $_POST.

Ожидаемое поведение: $_POST получение всего словаря.

Это ошибка или я что-то не так делаю?

Я использую php сервер в Ubuntu:

php -version
PHP 7.3.11-0ubuntu0.19.10.3 (cli) (built: Feb 12 2020 15:22:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.11-0ubuntu0.19.10.3, Copyright (c) 1999-2018, by Zend Technologies

РЕДАКТИРОВАТЬ:

  • Используя requestbin.com (как предложено Slam), я проверил, что requests фактически отправляет все data.
  • Я сделал три попытки получить его с php: (1) php сервер в моей Ubuntu (как показано в исходном вопросе), (2) виртуальную машину (VirtualBox, используя ЛАМПА под ключ), (3) бесплатный хостинг сайта. И никто из них не получает данные правильно , только последний элемент вложенного словаря.
  • Итак, это проблема PHP, а не requests. Но я все еще не знаю, что делать. Любая помощь о том, какой php код использовать?

С другой стороны:

  • Slam также предложил использовать json. Этот ответ объясняет, как получить его из php: { ссылка } (см. «Лучшее решение», внизу).
  • Решение json работает нормально в трех php тестах, которые я сделал. (Итак, это полезный обходной путь, но оригинальный вопрос все еще открыт).

1 Ответ

0 голосов
/ 14 марта 2020

Это определенно на стороне php, с точки зрения разбора запроса.

Вы можете перепроверить, как ваши запросы формируются через что-то вроде https://requestbin.com/

requests.post(..., data={'a': 1, 'b': [2, 3]}) будет отправлено как тело с a=1&b=2&b=3. Если вы хотите, чтобы он был json -кодирован, передайте данные как requests.post(..., json={'a': 1, 'b': [2, 3]}), которые будут отправлены как {"a": 1, "b": [2, 3]} соответственно

...