どうも、ゴエです。
今回は「XMLかなんかでPOSTして処理するWebAPIを自作すればいいじゃん」っと かるーい考えで作ろうとしたら詰まった話です。
ことの発端
最近「データを自動で別のサーバーに送れるようにする」ものをPHPで作る機会があり、「じゃぁ、データをXMLにしてcUrlでPOSTすればいいじゃんww」と かる~い考えでいました。
元々、とあるシステムのAPIを使ってXMLデータをPOSTする処理とかを作った事があったので「受け口さえ作れば簡単じゃんw」と思って鼻歌交じりでコーディングしてたら思いの他詰まったw
簡易プログラムの作成~そして詰まる
cUrlで実行する用のWebAPIを元々自作したことが無かったので、とりあえず簡単にデータをdumpするだけのプログラムをコーディング。
ここでふっと疑問点が「POSTのキーって何になるだ?」 通常だったら
1
|
$_POST['hoge'] = hogehoge
|
って形で キーを設定するんだけど今回はcUrlのCURLOPT_POSTFIELDSオプションにそのままXMLを突っ込む予定なのでキーがどうなるかわからなかったw
とりあえず、キーを指定せず
\[var\_dump($\_POST);\]で出すように作る事に。 ●WebAPIコード
1
2
3
|
<?php
var_dump($_POST);
?>
|
●実行プログラム
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?php
$oXml = <<<__EMD__
<?xml version="1.0" encoding="UTF-8"?>
<request>
<user>hogehoge</user>
<pass>12345</pass>
</request>
__EMD__;
$_cUrl = curl_init();
curl_setopt( $_cUrl, CURLOPT_URL, "WebAPIのURL" );
curl_setopt( $_cUrl, CURLOPT_HEADER , false);
curl_setopt( $_cUrl, CURLOPT_SSL_VERIFYPEER , false);
curl_setopt( $_cUrl, CURLOPT_RETURNTRANSFER , true);
curl_setopt( $_cUrl, CURLOPT_TIMEOUT,60);
//httpアクセスエラーオプションも追加
curl_setopt($_cUrl, CURLOPT_FAILONERROR, true);
curl_setopt( $_cUrl, CURLOPT_POST, 1 );
curl_setopt( $_cUrl, CURLOPT_POSTFIELDS, $oXml);
$result = curl_exec($_cUrl);
$errCode = curl_errno($_cUrl);
$errMsg = curl_error($_cUrl);
@curl_close($_cUrl);
var_dump($errCode);
var_dump($errMsg);
var_dump($result);
exit;
?>
|
そして、デバッグを兼ねて実行・・・・・ ●結果
1
2
3
4
5
6
7
8
|
Array
(
[<?xml_version] => "1.0" encoding="UTF-8"?>
hogehoge
12345
)
|
・・・・・・何だこりゃ・・・・。 なんかこっちが想定していたデータの出方と違う・・・・・(´・ω・`)
無事解決
データの出方が違っていたので原因を調査。 そしてやっと見つけたw
明日から本気出す: XMLをPOSTで送る/受け取る
どうやら、今回の様なやり方でXMLをPOSTすると配列としてでは無く、$_POSTという変数としてデータが入ってくるようでした。 そのため、$_POSTでごにょごにょするのでは無く、以下のような「php://input」をfile_get_contentsを使って取る必要があるとの事。 なので早速プログラムを修正
1
2
3
4
5
|
<?php
$oXml = file_get_contents('php://input');
var_dump($oXml);
exit;
?>
|
そして再度実行
1
2
3
4
5
|
<?xml version="1.0" encoding="UTF-8"?>
<request>
<user>hogehoge</user>
<pass>12345</pass>
</request>
|
(∩´∀`)∩ワーイ 出たー!
まとめ
今回受信側を初めて作るということもあってか思いの外手こずったw ぐぐってもやっぱり送信側の方法しか見当たらなったので調べるのも大変だったww 次回も開発する機会があったら忘れないようにメモしておこうw