ホームページ  >  記事  >  バックエンド開発  >  PHPのcurl関数を利用してPostリクエストを送信する際の注意点を詳しく解説

PHPのcurl関数を利用してPostリクエストを送信する際の注意点を詳しく解説

黄舟
黄舟オリジナル
2017-03-22 10:20:221702ブラウズ

前書き
私は数日前に仕事で要件に遭遇しました。ユーザーが特定のボタンをクリックすると、バックグラウンドで投稿リクエストが開始され、渡されたデータを受け入れます。最初、私の同僚は、会社のフレームワークによって公開されている

http_request()

メソッドを使用して送信しました。コードは次のとおりです。

public function http_request( $url, $post = '', $timeout = 5 ){ 
 if( empty( $url ) ){
  return ;
 }
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 
 if( $post != '' && !empty( $post ) ){
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($post)));
 }
 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
 $result = curl_exec($ch);
 curl_close($ch);
 return $result;
 }

最初は、渡されたデータが

application/json
によってエンコードされた JSON 文字列であることに気づきませんでした。

.バックグラウンドで直接使用しました。

application/x-www-form-urlencoded

エンコード形式のdataメソッドを受け入れて、渡されたデータを取得します(つまり、

$_POST

メソッドを使用して直接取得します)。その後、同僚が

http_request()

メソッドを直接変更し、データを

application/x-www-form-urlencoded

エンコード形式で直接渡したので、私は何も変更しませんでした。

上記の質問について、なぜあの時データを渡さなかったのかずっと疑問に思っていました。

今日でプロジェクトはほぼ完了し、以下のことを勉強しました。

php の

curl()

関数がポストリクエストを行うとき、データの形式は次の方法で渡すことができます:

(1): パラメータで構成される

key=>value

キーと値のペアの文字列。形式は次のとおりです。

name=xxx&age=23$sex=1

このリクエスト パラメータは、デフォルトでは

application/x-www-form-urlencoded

に従ってエンコードされます。
(2):

key=>value

パラメーターで構成されるキーと値のペアの配列 (1 次元配列のみにすることができ、高次元配列ではエラーが報告されます)。

の形式は次のとおりです:

[ name="xxx" , age = 23 , sex = 男 ]

このリクエスト パラメータは、デフォルトでは

multipart/form-data

形式に従ってエンコードされます。

上記の通り、

curl()

ポストリクエストを行う際、パラメータとして渡せるのは一次元配列のみなので、多次元配列を渡したい場合はどうすればよいでしょうか。

対処方法としては、以下の方法3と方法4の2つがあります。

(3): 多次元配列

http_build_query()

を処理し、key=>value キーと値のペア形式の文字列を待ちます。

以下に示すように:

$data = [
          "msg"=>"这是一条测试数据",
          "xxx" => "yyyy",
          "msg_data" => [
                          "name"=>"sunms",
                          "age"=>23,
                          "sex"=>"男",
                          "content"=>[
                                 1,2,3
                                ]
                       ],
       ];



は次の文字列を取得します:

msg=这是一条测试数据&xxx=yyyy&msg_data[name]=sunms&msg_data[age]=23&msg_data[sex]=男&msg_data[content][0]=1&msg_data[content][1]=2&msg_data[content][2]=3

このメソッドは

application/x-www-form-urlencoded进

行を通じてエンコードされ、受信側で $_POST を通じて直接取得できます。

(4): 多次元配列を json 形式の文字列に変換し、その文字列を

application/json

形式でエンコードし、受信側で

file_get_contents(“php://input”)

または

$GLOBALS[‘HTTP_RAW_POST_DATA']

を通じて渡された json 形式の文字列を取得し、json を変換します。フォーマットされた文字列を配列に変換して処理します。

$data = [];
$data_string = json_encode($data);
.....
//设置header信息
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
               'Content-Type: application/json',
               'Content-Length: ' . strlen($data_string))
      );


注:

application/json

形式でエンコードされたデータの場合、

$_POST

を直接取得することはできず、

file_get_contents(“php://input”)

または

$GLOBALS[‘HTTP_RAW_POST_DATA']

を通じて取得する必要があります。

概要
上記は、PHP で Post リクエストを送信するためにcurl関数を使用する際の注意事項の詳細な説明です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

関連記事:

PHPでcurlを使用してgetリクエストを開始するときのURLパラメータの問題

curlを使用してPHPでリクエスト(GETリクエストとPOSTリクエスト)を送信する

PHP開発ヒント(8)-CURLリクエストのコード詳細

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。