1

以下のページがあります。

ページjson.php:

$json_data = array(
    'first_name' => 'John',
    'last_name'  => 'Doe',
    'birthdate'  => '12/02/1977',
    'files'      => array(
        array(
            'name'   => 'file1.zip',
            'status' => 'good'
        ),
        array(
            'name'   => 'file2.zip',
            'status' => 'good'
        )
    )
);

$url = 'http://localhost/test.php';

$content = json_encode($json_data);

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
    array(
        "Content-type: application/json",
        "Content-Length: " . strlen($content)
    )
);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'json=' . urlencode($content));
curl_setopt($curl, CURLINFO_HEADER_OUT, true);

$json_response = curl_exec($curl);

$status      = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$header_sent = curl_getinfo($curl, CURLINFO_HEADER_OUT);

curl_close($curl);

echo $header_sent;
echo '<br>';
echo $status;
echo '<br>';
echo $json_response;

ページtest.php:

echo '<pre>';
print_r($_POST);
echo '</pre>';

ブラウザから json.php を呼び出すと、次の結果が得られます。

POST /json.php HTTP/1.1 Host: localhost Accept: */* Content-type: application/json Content-Length: 150
200

Array
(
)

送信しようとしている POST 文字列が表示されないのはなぜですか?

編集:

ヘッダーを設定しない場合Content-type: application/json(@landons のコメントに従って)、次の結果が得られます。

POST /ddabvd/widendcm/widendcm-finished.php HTTP/1.1 Host: localhost Accept: */* Content-Length: 150 Content-Type: application/x-www-form-urlencoded 
200
Array
(
    [json] => {"first_name":"John","last_name":"Doe","birthdate":"12\/02\/1977","files":[{"name":
)
4

1 に答える 1

2

ブラウザ内からフォームを投稿するときに使用される 2 つの公式コンテンツ タイプのいずれかにコンテンツ タイプが設定されていない場合、PHP は POST リクエストの内部リクエスト解析を使用しません。(たとえば、許可されている唯一のコンテンツ タイプはmultipart/form-data、ファイルのアップロードによく使用される で、デフォルト値は ですapplication/x-www-form-urlencoded)。

別の content-type を使用したい場合は、自分で行う必要があります。たとえば、からリクエスト本文を取得するときに、すべての解析を自分で行う必要がありますphp://input

実際、あなたのコンテンツ タイプは現在間違っています。これは application/json ではありません。これは、データが を読み取るためですjson={...}。これは、json として解析されると正しくありません。

于 2013-03-06T20:56:31.643 に答える