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

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

Я строю 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

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

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

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

Dieter

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Звучит так, будто у вас включены магические кавычки (что является большим нет-нет).Я бы посоветовал вам отключить это, в противном случае пропустите весь ваш ввод с помощью stripslashes ().

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

2 голосов
/ 22 июня 2011

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

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

Лучше, отключить магические кавычки GPC .G = Get, P = Post, C = Cookie.

В вашем случае Post .Почтовые значения автоматически («магические») заключаются в кавычки с одной косой чертой.

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

...