2011-06-22 10 views
3

私は、bodyタグに 'report'パラメータを指定してHTTP POSTメッセージを受け取るPHPスクリプトを実装しています。だからHTTP POSTレポート=。 私はこれをSimpleTest(PHPユニットテスト)でテストしています。私のPHPプログラムでURLエンコーディングが適切にjsonのエンコーディング/デコードの途中にあるようです

私はJSONを構築する:

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

私はPOSTを送信します。

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

(SimpleTestのからのWebTestCaseクラスのメソッドを呼び出します)。

SimpleTestのは、それがこの送信言う:

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

デバッグ文は上記の私に与えます:

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 

私は、次のような受信

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

をそして、私がデコードするとき、それができますエラー

Syntax error, malformed JSON 

'application/x-www-form-urlencoded'コンテンツタイプはSimpleTestによって自動的に選択されます。 'application/json'に設定すると、PHPスクリプトにパラメータが表示されず、 'report'変数が見つかりません。 URLエンコーディングに何か問題があると思われますが、私はここでどのようにjsonを取得すべきかについて迷っています。

また、ここでの通常の練習は何ですか? json本体全体を送信しても、キー/値のアプローチを使用していますか?または、HTTP POSTの本体にjson文字列をダンプして、何とかそれを読み取ることができますか? (私は変数を指摘することなく実際にそれを読むことに成功しなかった)。

とにかく、問題がやや明確に述べられていることを願っています。 ありがとうございました。

ディーター

+0

問題は確かに魔法の引用符で、明らかに私のバージョンのMAMPではデフォルトで有効になっています。 私は今それをkey/valueのペア(jsonが値)として送信し、content-typeを定義しないと、魅力的に機能します。 コンテンツタイプapplication/jsonを使用することはできませんが、これは私が明示的にしたくないRFCの種類のものに違反しているということです。 あなたの素晴らしい助けのために一束@johncartwrightと@hakreありがとう! – Dieter

+0

ヒント:回答を「回答」として選択してください(例:ジョンの – hakre

+0

@hakre:完了、チップありがとう:) – Dieter

答えて

4

あなたはマジッククオートは、(大きなノーノーでない)有効になっているようですね。これを無効にすることをお勧めします。それ以外の場合は、stripslashes()を使用してすべての入力を実行してください。

しかし、POSTデータをキーと値のペアとして参照する方が良いでしょう。そうしないと、php://入力ストリームを読み取る必要があります。

2

クイックフィックスについては、試してみてください。

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

良い、disable magic quotes GPC。 G = Get、P = Post、C = Cookie。

あなたの場合投稿。ポスト値は1つのスラッシュで自動的に引用されます( "マジック")。

here how to disable magic quotesを読んでください。

関連する問題