質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

6785閲覧

PHPのfile_get_contentsにて、failed to open streamエラーが発生しているが、原因と解消方法が分からない。

minyouyuu

総合スコア39

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/09/04 11:53

編集2019/09/04 12:38

PHPで簡単なWebAPIを実装してみる
上記URLに記載のソースコードを丸々コピーして、自分の環境で実装しましたが、エラーが起きています。

api.phpで実装したAPIをresult.phpで呼び出すものです。

■api.php <?php // 文字コード設定 header('Content-Type: text/html; charset=UTF-8'); // numが存在するかつnumが数字のみで構成されているか if(isset($_GET["num"]) && !preg_match('/[^0-9]/', $_GET["num"])) { // numをエスケープ(xss対策) $param = htmlspecialchars($_GET["num"]); // メイン処理 $arr["status"] = "yes"; $arr["x114"] = (string)((int)$param * 114); // 114倍 $arr["x514"] = (string)((int)$param * 514); // 514倍 } else { // paramの値が不適ならstatusをnoにしてプログラム終了 $arr["status"] = "no"; } // 配列をjson形式にデコードして出力, 第二引数は、整形するための定数 print json_encode($arr, JSON_PRETTY_PRINT); ■result.php <?php // 文字コード設定 header('Content-Type: text/html; charset=UTF-8'); // numパラメータにセットする値 $num = 10; // WebAPIのURL $url = "http://localhost:1024/api.php?num=${num}"; // URLの内容を取得し、json形式からstdClass形式に変換し取得 $data = json_decode(file_get_contents($url)); // 連想配列で取得したかったら第二引数にtrueを指定↓ // $data = json_decode(file_get_contents($url), true); // dataのstatusがyesだったら(出力に成功したら) if($data->status == "yes") { // 114倍の値をprint print $data->x114; }

エラー内容

Warning: file_get_contents(http://localhost:1024/api.php?num=10): failed to open stream: �Ώۂ̃R���s���[�^�[�ɂ��ċ��ۂ��ꂽ���߁A�ڑ��ł��܂���ł����B in C:\xampp\htdocs\php\server1\result.php on line 10 Notice: Trying to get property 'status' of non-object in C:\xampp\htdocs\php\server1\result.php on line 15

エラー内容ver2
result.phpの
header('Content-Type: text/html; charset=UTF-8');を
header('Content-Type: application/json; charset=UTF-8');に変えた場合

<br /> <b>Warning</b>: file_get_contents(http://localhost:1024/api.php?num=10): failed to open stream: �Ώۂ̃R���s���[�^�[�ɂ��ċ��ۂ��ꂽ���߁A�ڑ��ł��܂���ł����B in <b>C:\xampp\htdocs\php\server1\result.php</b> on line <b>10</b><br /> <br /> <b>Notice</b>: Trying to get property 'status' of non-object in <b>C:\xampp\htdocs\php\server1\result.php</b> on line <b>15</b><br />

何がおかしいのか、全く分かりません。file_get_contentsが原因だとは思いますが、解消方法が分かりません。

result.phpを使わず、http://localhost/php/server1/api.php?num=10と、ブラウザに直接urlを入力するとJSONを取得できるので、result.phpに誤りがあるのだと思います。

お手数ですが、ご教授のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/04 11:59

TCP1024番ポートで確実にwebサーバーが立ち上がっていてphpの処理が動かせられるのは確認済みでしょうか。それと、テスト環境にウイルス対策ソフトやファイアウォールを仕込んでいたら、TCP1024番は公開済みでしょうか。
minyouyuu

2019/09/04 12:05

・TCP1024番ポートで確実にwebサーバーが立ち上がっていてphpの処理が動かせられることは確認済みです。 ・すみません、ウイルス対策ソフトや、ファイアウォールのこと、TCP1024番が公開済みかはよく分かりません。家のPCなので、特に何か設定をしたりはしていません。xamppについてきたApacheで動かしています。
m.ts10806

2019/09/04 12:08

getのようですが直にURL打って確認はできてますか? またJSONを返すのにレスポンスヘッダがJSONにしていないのはどういう意図がありますか?
minyouyuu

2019/09/04 12:27

・直にURLを打つと、正常に動作します。 ・すみません、レスポンスヘッダのことはよく分からないまま、サイトにあったソースをコピペしました。レスポンスヘッダをContent-Type: application/jsonに修正しました。
m.ts10806

2019/09/04 12:29

application/jsonで試した結果も追記願います
minyouyuu

2019/09/04 12:32

application/jsonの場合でも、表示形式が少し変わっただけで、同じエラーが出ております。
m.ts10806

2019/09/04 12:34

質問本文に追記願います。出力が変わったのであればそれはそれでヒントになるかもしれませんし
minyouyuu

2019/09/04 12:38

すみません...追記しました。
m.ts10806

2019/09/04 13:36

怒っているわけではないので安心してください。情報は多い方が問題切り分けも出来ますしより具体的なアドバイスも可能となります。ただ、 >http://localhost/php/server1/api.php?num=10と、ブラウザに直接urlを入力するとJSONを取得できる と書かれていますがコードで書かれているのは http://localhost:1024/api.php?num=${num} ですよね。 PHPに書かれているURLと違うURLとしたのはどういう訳があるのでしょうか?
退会済みユーザー

退会済みユーザー

2019/09/05 00:59

テストして動作した、とするURLもそのまま質問文中に追記お願いします。phpコード内に書いているのと異なっていたりしませんでしょうか。
minyouyuu

2019/09/05 11:13

皆様、すみません。解決いたしました。 ご指摘のとおり、result.php内に記載のURLが誤っていたことが原因でした。お騒がせして申し訳ありません。
guest

回答2

0

XAMPPってはなしが出てきたので。
ふつうにXAMPPをインストールすると、
XAMPP Control Panelを立ち上げればサーバーソフト類が稼働しているかどうかわかります。
例えば、うちのばあいは
イメージ説明
みたいな感じで、Port(s)ってところにwebサーバーがリクエストを受け付けるポート番号が表示されています。
うちは敢えて設定を変更しているので10080とかなっていますが、
質問者さんの環境ではどうなっていますか。

で、そのPort(s)に表示されている番号を、
phpのコードの中で1024って書いてあるところを合わせないと意味がないです。
設定変更など一切していなければ、たぶん80になっているでしょう。
もしかしたら80じゃない別の番号になっているかもしれません。

$url = "http://localhost:1024/api.php?num=${num}";
が、もしもうちの環境で動かすなら
$url = "http://localhost:10080/api.php?num=${num}";
になるという意味です。
質問者さんの環境のポート番号に合わせる必要があります。

http://localhost/php/server1/api.php?num=10

で動作したのであれば、
$url = "http://localhost/server1/api.php?num=${num}";
とするべきところです。

投稿2019/09/04 12:04

編集2019/09/05 01:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

皆様、すみません、解決いたしました。

サイトにあったソースコードをそのままコピーしたため、result.php内の$urlに記載するURLを自分の環境のURLに書き換えずに実行していました。

お手数をお掛けしまして、申し訳ありませんでした。
ご回答や、ご質問をくださり、本当にありがとうございました。

投稿2019/09/05 11:10

編集2019/09/05 11:21
minyouyuu

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問