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

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

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

JSONP(JSON with padding)は、JSONを使用した関数呼び出しのための仕組み。クロスドメインでのデータの受け渡しが可能です。JavaScriptからクロスドメインで容易にデータを扱うことができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

4192閲覧

jQueryのAjaxを使ったJSONPで、クロスドメイン取得したコンテンツソースを参照する方法

cnx

総合スコア19

JSONP

JSONP(JSON with padding)は、JSONを使用した関数呼び出しのための仕組み。クロスドメインでのデータの受け渡しが可能です。JavaScriptからクロスドメインで容易にデータを扱うことができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2017/06/14 06:08

jQueryのAjax($.ajax)を使って以下のようにクロスドメインアクセスしようとしています。
以下のコードではTARGET_URLに指定されたURLにアクセスし、その結果200OKで接続疎通が確認できたのか、出来なかったのかを判定しようとしています。いわゆる疎通チェックのためにJSONPを利用したクロスドメイン制約の迂回をしています。

そのためTARGET_URLで取得できるデータはJSONP形式ではありません。
相手がJSONP形式ではなくてHTML形式の場合には結果的に常にerrorを通ってcompleteのコードが実行されます。
(success, error, completedの書き方が古いとか不適切という所は置いておいてください)

error→completedではありますが、きちんとstatusには疎通結果が200とか404とか入ってくるので疎通確認の目的は果たせ得ている感じです。ここで2点知りたいことがあります。

  1. dataType: 'JSONP'としておいてアクセス先がHTML形式ですとJSの構文エラーのようになるようです。HTMLの内容は疎通確認先のサイトによって様々だと思いますが、思わぬ問題が発生したり懸念などはあるでしょうか。(たまたまアクセス先が悪意のあるJSOMP形式のコンテンツで、コールバック関数内に不適切なコードが書かれているような場合を除きます)
  2. 疎通確認だけではなくて、取得したデータ(コンテンツソース)を文字列として取得したいのですが方法はあるでしょうか。もともと<script></script>の中身を読んできている構造だと思うので、何か方法があるのでは無いかと思っているのですが方法がわかりません。

出来ればjQueryを活用して完結な記述方法があると嬉しいです。

$.ajax({ type: 'GET', url: TARGET_URL, dataType: 'jsonp', timeout:10000, jsonpCallback:"dummycallback" success: function(json){ alert('success'); }, error: function(json){ }, complete: function(json){ if (json['status'] == 200) { alert('connection OK'); } else { alert('connection NG'); } }, });

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

  1. Android SDKのWebViewにて
  2. クロスドメイン制約を回避しつつ
  3. サーバー側のヘッダー設定も不要で
  4. 指定したhtmlのソース(コンテンツ)を取得する

ということは少なくとも現時点では「不可能」と認識しました。
今回の具体的な用途としては、7SPOTなどのフリーWiFiに接続されて強制的に期待するコンテンツと異なる(ログイン画面など)を読み込まされていないかを判定したかったので、判定用にjsonpファイルを別途は位置することにしました。
dataType:jsonpの場合は、上記の4条件(4番はjsonpのコンテンツ=Key/Valueとなる)を満たすことが可能です。
調査結果としてはフルブラウザでは「不可」ですが、Android SDKのWebViewであればdataType:textでも(crossDomain: trueも追加することで)上記の4条件を満たせるのですが、フルブラウザで不可のため開発をフルブラウザで実施したり、今後Android側でも修正が入るようなリスクもあるので不採用としました。

投稿2017/07/03 23:25

cnx

総合スコア19

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

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

0

error:function(xhr,err){ console.log(xhr.status); console.log(err); }

xhrのエラーと、受け取ったあとのエラーは違います。
クロスドメインで重要なのはステータスコードなのでerrの方はさほど気にすることはないかと
パースの失敗などもエラーに流れるのでどうしてもsuccessに回したいなら
dateTypeは'text'にしておけばよい話です。

投稿2017/06/14 06:24

yambejp

総合スコア114784

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

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

cnx

2017/06/14 07:47

ありがとうございます。 dataTypeがjson, jsonpの場合にしかクロスドメイン跨ぎが出来ないと思い込んでいたのですが、dataType: textでもcrossDomain: trueとすればクロスドメインをまたいでコンテンツソースを取得できるという事でしょうか。実際にdataType: text, crossDomain: trueで試したところ200OKは取れているようなのですが、 http://api.jquery.com/jquery.ajax/ こちらを見ながら確認しているのですが、その辺りがどちらとも明言されていないようです。
cnx

2017/06/14 09:14

追伸です。 Android端末のWebViewでは200OKで疎通確認が出来るのですが、Windows版Firefox(v54.0)ではクロスドメイン制約により情報が取得できませんでした({"readyState":0,"status":0,"statusText":"error"}となる)。 dataType: jsonpとするとWin版Firefox環境でもちゃんと情報を取得できますので、やはりdataType: textではクロスドメイン制約をまたげないのではないでしょうか。dataType: jsonpとすると取得したデータソースを文字列として取得する方法がやはりわかりません。 逆に、Android端末ではすべからくクロスドメイン制約をまたげるというのであれば、それでも良いのですが確認する方法はあるのでしょうか。
yambejp

2017/06/15 01:21

すみません、ちょっと勘違いしました jsonpで要求して文字列を受け取りたいのですね jsonpの戻り値はscriptなので形式が違えばparsererrorの回避は難しいですね ちょっと解決策があるかどうか調べてみます。
yambejp

2017/06/15 03:43

いろいろ試してみましたが、やはり無理そうですね jsonpってしょせん、 <script src="exsample.com?callback=hoge" type="text/javascript"></script> をhtmlに埋め込んでくれるだけなので javasriptのソースとして読めないものはNGなようです
cnx

2017/06/15 05:45

わざわざ調べて頂きありがとうございます。 <script></script>のタグの中身を$("script")[0]のような工夫で読み込むということもやはり難しい感じでしょうか。スクリプトがエラーになってしまうことはやむを得ないのですが、読み込んだ内容が正しいかどうかの判定を行いたいのが今回の目的となっています。 また、対象環境がAndroid端末上のWebViewなので、何故かAndroid/WebView環境においては実験でdataType: textでもCORS回避できている状況が仕様として正しくて、恒久的に利用できる手法と分かればそれも一つの解ではないかと考えています。
yambejp

2017/06/15 10:28

これ以上はいかにセキュリティーの穴をつくかという話になるので、 費用対効果にもあわないと思います。 サーバー側のプログラムを用意してワンクッションかます方が現実的です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問