質問編集履歴

1 現状と最終的に行いたいことについての追記

yuta1029129

yuta1029129 score 28

2018/12/14 16:45  投稿

PHPを用いたcurlでレスポンスされた文字列ではない謎の結果について…質問をお願いします。
PHPのcurl(file_get_contents)でAPIからレスポンスを受け取る動作を作成中なのですが、返ってくるレスポンスが何なのかわからなくて困っています。仕様書にはbodyにxmlで返すとあるのですが実行したコードは
```PHP
       $headers = [
           'Host: hoge',
       ];
       $ch = curl_init();
       $url = 'https://hogehoge';
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
       $xml = curl_exec($ch);
       curl_close($ch);
// この実行結果に問題
       var_dump($xml);
// XML文字列を連想配列に変換する
       $xmlObject = simplexml_load_string($xml);
       var_dump($xmlObject);
       $xmlArray = json_decode(json_encode($xmlObject), true);
       var_dump($xmlArray);
```
このvar_dumpの表示結果が上から
string(703) " "
object(SimpleXMLElement)#89 (0) { }
array(0) { }
と表示されます。
curlのレスポンスは文字列で返ってくると思うのですが、$xmlをvar_dumpした時のstring(703) " "は
何なのでしょうか?ちなみに$xml[0]でvar_dumpすると一文字だけ格納されています。配列を1,2,3…と確認してみると
直接ターミナルから取得した文字列が一文字ずつ格納されていました。でもimplodeしようとすると配列じゃないとエラーが出ます。
print_rでは何も表示されません。
配列じゃないのにキーを指定すると文字が入ってる。そもそもcurlのレスポンスって文字列なのでは?
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);もちゃんと書いてますし…
質問としましては
・格納されているstring(703) " "は何なのでしょうか?
・そもそも文字列でレスポンスを受け取りたい。そのための必要な記述はありますか?
皆様お手数ではございますがご教授ください。よろしくお願いします。
皆様お手数ではございますがご教授ください。よろしくお願いします。
--更新--
頂いた回答と調査により、少し解明したことと新たな疑問点を記載します。
・文字列ではないレスポンスは返ってきている→CURLOPT_RETURNTRANSFERをtrueにしているのに文字列にならないのはなぜ?
・レスポンスをvar_dumpするとstring(703) " "とだけ表示されるがソースを表示するとxmlが表示される→なぜソース表示すると表示される?
・simplexml_load_string()しても文字列ではないからか結果が空になる。
最終的には返ってきたレスポンスを表示するのではなく、レスポンスとして返ってきたxmlを配列にしたいです。
表示は出来なくてもいいので最終的にxmlで書かれたものを配列に出来る方法をご教授ください。
よろしくお願いします
  • PHP

    24949 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • cURL

    206 questions

    cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る