3

「レポート」パラメーターに関連付けられた JSON 文字列を本文に含む HTTP POST メッセージを受信する PHP スクリプトを実装しています。したがって、HTTP POST レポート =. これを SimpleTest (PHP Unit Testing) でテストしています。

私はjsonを構築します:

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

私はポストを送ります:

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

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

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 スクリプトはパラメーターを認識しないため、「report」変数を見つけることができません。URLエンコーディングで何か問題が発生していると思いますが、jsonをどのように取得する必要があるかについて、ここで迷っています。

また、ここでの通常の練習は何ですか?JSON本体全体を送信するだけでも、キー/値アプローチを使用しますか? または、JSON 文字列を HTTP POST の本文にダンプして、何らかの方法で読み取ることはできますか? (参照する変数がなければ、実際にそれを読み取ることに成功しませんでした)。

とにかく、問題がある程度明確に述べられていることを願っています。事前にたくさんありがとう。

ディーター

4

2 に答える 2

4

魔法の引用符が有効になっているようです (これは大したことではありません)。これを無効にすることをお勧めします。それ以外の場合は、stripslashes() を介してすべての入力を実行します。

ただし、POST データをキーと値のペアとして参照することをお勧めします。そうしないと、php://input ストリームを読み取る必要があります。

于 2011-06-22T19:07:08.107 に答える
2

簡単に修正するには、次のことを試してください。

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

より良いのは、マジッククォートGPCを無効にすることです。G = Get、P = Post、C=Cookie。

あなたの場合は投稿します。投稿値は、単一のスラッシュで自動的に引用されます(「魔法」)。

魔法の引用符を無効にする方法をここで読んでください。

于 2011-06-22T19:11:28.640 に答える