勉強したことのメモ

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

  関連記事

PHPの日付・時刻関連
PHPの日付・時刻関連

使えそうなものをまとめてメモ。 【関数】 ----------- ■date 日 ...

PHPにてhosts設定を行った上で他サイト・サーバにアクセスする方法
PHPにてhosts設定を行った上で他サイト・サーバにアクセスする方法

開発中の案件だとhosts設定を行ってサーバにアクセスする、ということがある。作 ...

PHPでエラーメッセージを見やすくするwhoopsの利用方法
PHPでエラーメッセージを見やすくするwhoopsの利用方法

PHPのエラーメッセージが見づらい。これはこういうもの、と諦めていたがCodei ...

PHPのHTTPクライアント用ライブラリ「Guzzle」の利用方法
PHPのHTTPクライアント用ライブラリ「Guzzle」の利用方法

以前に「Requests for PHP」を試したが、似たようなライブラリで「G ...

Class 'DOMDocument' not foundエラーの対処方法
Class 'DOMDocument' not foundエラーの対処方法

PHPでphpQueryというライブラリを利用しようとすると「Fatal err ...