Кодирование URL, кажется, мешает правильному кодированию/декодированию json в моей программе PHP

Я реализую PHP-скрипт, который получает сообщение HTTP POST с в теле строкой json, привязанной к параметру «отчет». Итак, отчет HTTP POST=. Я тестирую это с помощью SimpleTest (модульное тестирование PHP).

Я создаю json:

$array = array("type" => "start"); // DEBUG
$report = json_encode($array);

Я отправляю ПОЧТУ:

$this->post(LOCAL_URL, array("report"=>$json));

(вызывает метод класса WebTestCase из SimpleTest).

SimpleTest говорит, что отправляет это:

POST /Receiver/web/report.php HTTP/1.0
Host: localhost:8888
Connection: close
Content-Length: 37
Content-Type: application/x-www-form-urlencoded

report=%7B%22type%22%3A%22start%22%7D

Я получаю как таковой:

$report = $_POST['report'];    
$logger->debug("Content of the report parameter: $report");    
$json = json_decode($report);

Оператор отладки выше дает мне:

Content of the report parameter: {\"type\":\"start\"}

И когда я расшифровываю, выдает ошибку

Syntax error, malformed JSON

Тип контента «application/x-www-form-urlencoded» автоматически выбирается SimpleTest. Когда я устанавливаю значение «application/json», мой PHP-скрипт не видит никаких параметров и поэтому не может найти переменную «отчет». Я предполагаю, что что-то не так с кодировкой URL-адреса, но я не понимаю, как мне получить json через.

Кроме того, какова обычная практика здесь? Использует ли кто-нибудь подход ключ/значение, даже если вы просто отправляете все тело json? Или я могу просто сбросить строку json в тело HTTP POST и как-то прочитать ее? (Мне не удалось прочитать его без переменной, на которую можно было бы указать).

Во всяком случае, я надеюсь, что проблема несколько ясно сформулирована. Большое спасибо заранее.

Дитер


person Dieter    schedule 22.06.2011    source источник
comment
Проблема действительно заключалась в волшебных кавычках, по-видимому, они включены по умолчанию в моей версии MAMP. Если я отправлю его сейчас как пару ключ/значение (json является значением) и не определяя тип содержимого, это работает как шарм. Однако я не могу использовать тип содержимого application/json, но я предполагаю, что причина этого в том, что я нарушаю некоторые вещи RFC, чего я явно не хочу делать. Большое спасибо @johncartwright и @hakre за вашу потрясающую помощь!   -  person Dieter    schedule 23.06.2011
comment
Совет: выберите один из ответов в качестве ответа, например. Джона.   -  person hakre    schedule 23.06.2011
comment
@hakre: Готово, спасибо за совет :)   -  person Dieter    schedule 24.06.2011


Ответы (2)


Похоже, у вас включены волшебные кавычки (что очень плохо). Я бы посоветовал вам отключить это, в противном случае запускайте весь ввод через stripslashes().

Однако лучше ссылаться на данные POST как на пару ключ/значение, иначе вам придется читать входной поток php://.

person John Cartwright    schedule 22.06.2011

Для быстрого исправления попробуйте:

$report = stripslashes($_POST['report']);

Лучше отключить волшебные кавычки GPC. G=Получить, P=Отправить, C=Cookie.

В вашем случае Опубликовать. Значения сообщений автоматически («магически») цитируются с одной косой чертой.

Прочтите здесь, как отключить магические кавычки.

person hakre    schedule 22.06.2011