1

のコンテンツ タイプで PHP curl を使用して生の JSON を送信するにはどうすればよいapplication/x-www-form-urlencodedですか?

説明させてください:

私は、HTTP POSTリクエストを受け入れる Web サーバーと通信しています。この Web サーバーは、JSON オブジェクトをリクエストの本文として使用します。通常、HTTP クエリ パラメータの表示に慣れています。

私の状況では、次の content-type でリクエストを送信する必要があります

コンテンツ タイプ: application/x-www-form-urlencoded

本文は未加工の JSON である必要があります。

したがって、多くの可能性があります。私は次のことを試しました:

<?php
      $server_url = "http://server.com";
      $curl = curl_init($server_url);
      $data_array = array("a"=> "a_val", "b" => array("c"=>"c_val", "d"=>"d_val") );

 $options = array(
       CURLOPT_POST            => TRUE,
       CURLOPT_HTTPHEADER     => array('Content-Type: application/x-www-form-urlencoded'),
       CURLOPT_POSTFIELDS      => json_encode($data_array),
       CURLOPT_COOKIEJAR       => realpath('tmp/cookie.txt'),
       CURLOPT_COOKIEFILE      => realpath('tmp/cookie.txt')
        );

    curl_setopt_array($curl, $options);
    $return = curl_exec($curl);  
    var_dump($return);  
    curl_close($curl);
?>

私もエスケープしようとしましたjson_encode()

...    
CURLOPT_POSTFIELDS      => "\"" . json_encode($data_array) .  "\"" ,
...

サーバーがhtmlパラメーターを解析できた場合、私はこれを行うことができました:

...    
CURLOPT_POSTFIELDS      => http_build_query($data_array)
...

ただし、そうではなく、回避策が必要です。

content-type を変更しても機能しないことに注意してください。を使用してみtext/plainましたが、サーバーはそれを受け入れませんでした。

4

2 に答える 2

0

私はあなたの質問を完全に理解しているとは言えないので、2 つの異なるバージョンに回答します。

JSON データを送信しますが、(不正確な)application/x-www-form-urlencodedコンテンツ タイプを使用します

なぜこれをやりたいのかわかりませんが、そうするのであれば、かなり単純なはずです。

$data_array = array(
    'a' => 'a_val',
    'b' => array(
        'c' => 'c_val',
        'd' => 'd_val'
    )
);

$json = json_encode($data_array);

$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_USERAGENT, 'PHP/' . phpversion());
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $json);
curl_setopt($c, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$result = curl_exec($c);
if (curl_errno($c)) {
    return trigger_error('CURL error [' . curl_errno($c) . '] ' . curl_error($c));
}
curl_close($c);

echo $result;

ここでは、意図的に不正確なデータをサーバーに送信していることに注意してください。JSON を送信していますが、それを urlencoded と呼んでいます。あなたはおそらくこれをしたくないでしょう。何らかの理由でこれを行う必要がある場合は、このハックな回避策を使用するよりも、実際の問題が何であれ修正する方がよいでしょう。

cURL ではなく Guzzle を使用していた場合は、少しトリッキーになるかもしれません。Guzzle には JSON と urlencoded の両方のサポートが組み込まれていますが、このようにいじりたい場合は、それを使用しない方がよいでしょう。JSON データを自分で ( を使用して$json = json_encode($data)) 生成し、Guzzle で Content-Type を手動で設定します。

URL エンコードされた JSON データを送信する

これは奇妙な設定ですが、正確です。少なくとも、HTTP ヘッダーに嘘をつくことはありません。

基本的には上記と同じですが、これを追加します。

$json = json_encode($data_array);
$data = array('JSON' => $json);
$body = http_build_query($data);

そして、 to の代わりに to を設定CURLOPT_POSTFIELDS$bodyます$json

おそらく本当にすべきこと: JSON を JSON として送信します。

ほとんどの場合、(例 1 のように) JSON データを送信し、Content-Type を に設定することをお勧めしますapplication/json。これは例 2 よりもデータ サイズが小さく (urlencoding ステップによりデータのサイズが大きくなります)、正確なヘッダー データが含まれています。

于 2016-02-29T11:45:50.630 に答える