ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:curlでPOSTして、結果のXMLを処理

他社のAPIで認証を行わなければならなくなりました。
仕様を確認すると、POST形式でidとパスワードを送信し、結果をXML形式で返してきます。

XMLPHPで処理したことがなかったので検索しました。

curlを使って、idとパスワードを送信

curlでPOSTする方法の参考にしたのは以下の記事です。
qiita.com
ほぼ記事通りのコードとなりました。

$POST_DATA = array(
    'id' => '10001',
    'password' => '1234567890',
);

$curl = curl_init("https://www.example.com/api");
curl_setopt($curl, CURLOPT_POST, true);

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie');
curl_setopt($curl, CURLOPT_COOKIEFILE, 'tmp');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

$output = curl_exec($curl);

プログラミング
UnsplashDanial Igderyが撮影した写真

応答のXMLをsimplexml_load_string()で変換

応答のXMLは以下の形式です。
エラーの場合は、codeが空になります。

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <code>200</code>
</response>

XMLの処理方法の参考にしたのは以下の記事です。
qiita.com
liginc.co.jp
blog.dododori.com

simplexml_load_string()で応答をオブジェクトに変換して、文字列型に変換すれば良さそうとわかりました。
結果、以下のようなコードになり、空だった場合は、エラーと判定できました。

$xmlObject = simplexml_load_string($output);

$response= (string)$xmlObject->response;

if (empty($response)) {
    echo 'エラー';
}

適切な情報を見つけられたので、必要なコードが短時間で書けました。