※ ChatGPTを利用し、要約された質問です(原文:外部ドメインjavascriptとの通信)
外部ドメインjavascriptとの通信
このQ&Aのポイント
別サーバにあるjavascriptファイルとPHPファイルを通信させて呼び出し元サイトにデータを埋め込もうとしていますが、別サーバに移動させた際にデータが返らなくなってしまいます。
この問題の原因を調査するために、両方のサーバでApache2が動作していることや、APIファイルとPHPファイルのアドレスが正しく書かれていることを確認しました。
しかし、問題の解決には至っていないため、具体的な解決策を教えていただけると助かります。
WebAPIみたいなのを作りたくって、GoogleAdSenseとかを参考に色々やっていました。
そこで、別サーバにあるjavascriptファイルとPHPファイルを通信させて呼び出し元サイトにdocument.writeでデータを埋め込もうとしています。
構成としては、
(1)API呼び出し元サイト:from.html
(2)呼び出されAPIファイル:api.js
(3)api.jsと通信してデータを渡すphpファイル:sample.php
手順としては、
(1)では、
<script type="text/javascript" src="api.js">
として、APIファイルの呼び出し。
(2)と(3)では、
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1411752859
を参考に、api.jsからsample.phpを呼び出す。
sample.phpではサーバ内のデータベース検索結果をapi.jsに返す。
受け取った値をdocument.writeでfrom.htmlに埋め込む。
上記の構成・手順で、全て同一サーバ内にあるときにはうまくいっていました。
しかし、from.htmlを別のサーバに移動させて動作させた時、
httpObj.status=0となってしまい、phpからデータが返ってこなくなってしまいました。
自分で調べた所、
・両方のサーバでApache2は動いている
・<script type="text/javascript" src="api.js">のapi.jsの所は、ちゃんと置かれているサーバのアドレスも含めて書いている(もちろん、api.jsが呼び出すPHPファイル名も)
・from.htmlはhtmlファイルをダブルクリックなどしてるわけではなく、ちゃんとブラウザからHTTPでアクセスしている
「javascript httpObj.status 0」とかでググって出てきた原因を自分なりにチェックしてみたのですが、
中々うまくいかず苦労しています。
できれば具体的にどうすればいいのか教えて頂けると助かります。
宜しくお願いします。
お礼
お早いご回答ありがとうございます! XMLHttpRequest Level 2は少し調べたのですが、ちょっとよく分からず断念してしまいました。 が、JSONP方式は以下のような簡単にできるサイトを見つけ、その通りにしたら無事できました。 http://zblog.sakura.ne.jp/javascript/jsonp_sum.html XMLHttpRequestはずっと使っていたので、恥ずかしながら別ドメインでは使えないことを知りませんでした。 また1つ勉強になりました。 ありがとうございました。
補足
すいません、別の質問を立てようと思ったのですが、関連しているのでここでもう1つ質問させていただきます。 PHPファイルから受信した文字列を、API呼び出し元ファイルに埋め込もうとしたのですが、 (1)document.getElementById("result").innerHTML = result; //OK (2)document.write(result); //ダメ (3)document.getElementsByTagName("body")[0].innerHTML = result; //OK (4)document.getElementsByTagName("div")[0].innerHTML = result; //OK (5)document.getElementsByTagName("body")[0].appendChild(result); //ダメ (6)document.getElementsByTagName("div")[0].appendChild(result); //ダメ ※呼び出し元ファイルでは、<div id="result"></div>を埋め込んでいます 私的に、document.writeが使えなかったのが衝撃だったのですが、 何か理由があるのでしょうか? それとも使い方が間違っているのでしょうか・・・?