勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでcURLを用いて配列のデータをJSON形式でPOST送信及び受信する方法

  PHP

PHPで配列データを別サーバにJSON形式でPOST送信し、別サーバ側でもPHPで受信し何らかの処理を行いたかった。cURLでのPOST送信は過去にAPIリクエストする際等で対応したことがあったが受信側は対応したことがなく、$_POSTで試したところデータが受け取れなかったので対応方法をメモ。

 

対応方法

送信側(post.php)

<?php
$url = 'https://test.com/receive.php';
$data = [
    'id'  => 123,
    'name' => '鈴木',
    'msg' => [
        'type' => 'text',
        'text' => 'テストメッセージ',
    ],
];
$headers = [
    'Content-Type: application/json',
    'Accept-Charset: UTF-8',
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);

if( curl_errno($ch) ){
    //エラー時の処理
    echo 'Error:' . curl_error($ch);
}else{
    //成功時の処理
    echo 'Response: ' . $result;
}
curl_close($ch);

受信側にbasic認証をかけている場合

以下オプションを追記することでbasic認証を突破できる。

$id = 'xxxxx';
$pass = 'xxxxx';
curl_setopt($ch, CURLOPT_USERPWD, $id . ":" . $pass);

受信側(receive.php)

<?php
$json = json_decode(file_get_contents('php://input'), true);
print_r($json);

結果

post.phpをブラウザから開くと以下結果が出力される筈。

Response: Array
(
    [id] => 123
    [name] => 鈴木
    [msg] => Array
        (
            [type] => text
            [text] => テストメッセージ
        )

)

$_POSTで受け取れない理由

JSON形式指定('Content-Type: application/json')しているため$_POSTで受け取れない。

JSON形式指定を外し、json_encodeではなくhttp_build_queryによるURLエンコードでデータを送信すれば$_POSTで受け取れる。具体的には以下になる。

$headers = [
    'Accept-Charset: UTF-8',
];

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);

 

参考サイト

https://stray-light.info/wp/php-curl-api/

 - PHP

  関連記事

CodeIgniter4で簡易版ログインシステムの実装方法(管理画面向け)
CodeIgniter4で簡易版ログインシステムの実装方法(管理画面向け)

CodeIgniter4で管理画面向けの簡易版ログインシステムを作成したい。通常 ...

PHPで他サーバにHTTP経由にてファイルをアップロードする方法
PHPで他サーバにHTTP経由にてファイルをアップロードする方法

formで画像を送信した後、他サーバにファイルをアップロードしたかった。以前はP ...

PHPの配列でキーの最大値を取得
PHPの配列でキーの最大値を取得

PHPの配列でキーの最大値を取得したかった。以下で対応する。 $test = a ...

PHPでGoogle翻訳を手軽に扱えるライブラリ「google-translate-php」の利用方法
PHPでGoogle翻訳を手軽に扱えるライブラリ「google-translate-php」の利用方法

サイト内で一部テキストのGoogle翻訳を行いたい。ただ、Google Clou ...

CodeIgniter4でCronを実行する方法
CodeIgniter4でCronを実行する方法

CodeIgniter4.4.4で特定の処理をCronで自動実行させたい。以下に ...