SlideShare a Scribd company logo
1 of 19
Download to read offline
いまさら聞けないJSONPのまとめ
2015.5.25
Yujiro Araki
Ajaxの制約
クロスドメイン通信を行うことができない
www.foo1.com www.bar1.com
①アクセス
$.ajax({
url: 'http://www.bar1.com/‘
});
②ページ表示
③Ajax実行②の内容
・JSON with padding(付け足しJSON)の略
・JSON(JavaScript Object Notation)を拡張した
プログラミングモデル
・SOP※による他サーバへの問い合わせ制限を回避
JSONPとは
引用:Web/DBプログラミング徹底解説
http://keicode.com/script/jsonp-same-origin-policy.php
※同一生成元ポリシー(Same Origin Policy)
理由:src属性に設定するURLはSOP適用外=異なるドメイン設定可能
もう少し分かりやすく言うと
script要素を利用してデータを取得
src属性に設定するURLはSOP適用外
script要素を利用する理由
script要素のsrc属性がSOP適用外であることを示す例
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js">
</script>
Google CDN
参考:https://developers.google.com/speed/libraries/
{ name: 'foo', price: 3000 }
JSONデータの例
showPrice({ name: 'foo', price: 3000 });
JSONPの例
<script>
function showPrice(data) {
alert("Name: " + data.name + ", Price: " + data.price);
}
showPrice({ name: 'foo', price: 3000 });
</script>
index.html
JSONPの利用(1/5)
JSONPによるクロスドメインの通信: 第1回 JSONPとjQueryを組み合わせ、強力なマッシュアップを迅速に作成する
http://www.ibm.com/developerworks/jp/web/library/wa-aj-jsonp1/
<script>
function showPrice(data) {
alert("Name: " + data.name + ", Price: " + data.price);
}
showPrice({ name: 'foo', price: 3000 });
</script>
この部分を他サーバ(user-domain)の外部ファイル読み込みにする
index.html
JSONPの利用(2/5)
<script>
function showPrice(data) {
alert("Name: " + data.name + ", Price: " + data.price);
}
</script>
<script src="http://user-domain/show.js"></script>
showPrice({ name: 'foo', price: 3000 });
show.js
index.html
JSONPの利用(3/5)
<script>
function showPrice(data) {
alert("Name: " + data.name + ", Price: " + data.price);
}
</script>
<script src="http://user-domain/show.js"></script>
showPrice({ name: 'foo', price: 3000 });
show.js
index.html
この部分を動的生成にする
JSONPの利用(4/5:動的生成)
動的生成にする理由:イベント発生契機に通信を行いたい場合
<script>
function showPrice(data) {
alert("Name: " + data.name + ", Price: " + data.price);
}
function show() {
var script = document.createElement('script');
script.src = 'http://user-domain/show.js';
(document.getElementsByTagName('head'))[0].appendChild(script);
}
</script>
<a href="#" onclick="show() return false;">click</a>
index.html
show.js
showPrice ({ name: 'foo', price: 3000 });
JSONPの利用(5/5:動的生成)
<script>
function callback(data) {
alert("Name: " + data.name + ", Price: " + data.price);
}
function show() {
var script = document.createElement('script');
script.src = 'http://user-domain/show.php?jsonp=callback;
(document.getElementsByTagName('head'))[0].appendChild(script);
}
</script>
<a href="#" onclick="show() return false;">click</a>
<?php
echo $_GET['jsonp'] . "({ name: 'foo', price: 3000 });";
?>
show.php(他サーバ)
index.html
クエリーパラメータ「jsonp」の値をコールバック関数名として設定
関数のパラメータにJSONを設定
JSONPの実用的な実装例
<script>
$.ajax({
dataType: 'jsonp',
url: "http://user-domain/hoge.php",
success: function(data){
alert("Name: " + data.name + ", Price: " + data.price);
},
});
</script>
jQueryによるAjax+JSONPのサポート:$ajax
index.html
<script>
$.ajax({
dataType: 'jsonp',
crossDomain: true,
jsonp : 'jsoncallback',
url: "http://user-domain/hoge.php",
success: function(data){
alert("Name: " + data.name + ", Price: " + data.price);
},
});
</script>
jQueryによるAjax+JSONPのサポート:$ajax
index.html
<script>
$.getJSON("http://user-domain/hoge.php?&callback=?",
function(data) {
$('div').html(data.title + data.description);
});
</script>
クエリーパラメータ「callback(名称は何でもよい)」の値に
「?」を設定することでJSONPリクエストとして扱われる。
「?」の部分はjQueryで自動生成
実際のHTTPリクエスト:
http://user-domain/hoge.php?callback
= jQuery17208957796988929256_1334645135858&_=1334645136039
<?php
echo $_GET['jsonp'] . '(' . "{ title: 'foo', description: 'bar' }" . ');';
?>
hoge.php
実行される
関数
最後の“_=[TIMESTAMP]“はキャッシュを無効にするためのもの http://api.jquery.com/jQuery.ajax/
$.ajaxでのみ有効な模様
jQueryによるAjax+JSONPのサポート:$getJSON
$.getJSON("http://user-domain/hoge.php?jsoncallback=?",
{
aaa : bbb,
},
function(data) {
alert("first success");
$('div').html(data.title + data.description);
})
.done(function() {
alert("second success");
})
.fail(function() {
alert("error");
})
.always(function() {
alert("complete");
});
$.getJSON
Google Code: jquery-jsonp
https://github.com/jaubourg/jquery-jsonp
エラーハンドリング、キャッシング、タイムアウトなど、デフォルトでは対応でき
ない機能が使えるようになるみたい
jQueryでJSONP
http://blog.mudaimemo.com/2008/09/jqueryjsonp.html
静的なJSONデータをパラメータに持つJavaScript関数を呼び出す方法

More Related Content

What's hot

What's hot (20)

Sharding with sql alchemy
Sharding with sql alchemySharding with sql alchemy
Sharding with sql alchemy
 
AOA2.0を実装してみた
AOA2.0を実装してみたAOA2.0を実装してみた
AOA2.0を実装してみた
 
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみたFirebase Authを Nuxt + Railsの自前サービス に導入してみた
Firebase Authを Nuxt + Railsの自前サービス に導入してみた
 
Github Actionsで GASのデプロイを自動化した
Github Actionsで GASのデプロイを自動化したGithub Actionsで GASのデプロイを自動化した
Github Actionsで GASのデプロイを自動化した
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
BigQuery Query Optimization クエリ高速化編
BigQuery Query Optimization クエリ高速化編BigQuery Query Optimization クエリ高速化編
BigQuery Query Optimization クエリ高速化編
 
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
製造装置データ収集の選択肢 (AWS IoT Deep Dive #5)
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
wakamonoによるISP的実験PROJECT AS59105のご紹介
wakamonoによるISP的実験PROJECT AS59105のご紹介wakamonoによるISP的実験PROJECT AS59105のご紹介
wakamonoによるISP的実験PROJECT AS59105のご紹介
 
Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界Apache tinkerpopとグラフデータベースの世界
Apache tinkerpopとグラフデータベースの世界
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃうフレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 

Similar to いまさら聞けないJSONPのまとめ

JSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めようJSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めよう
VOYAGE GROUP
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkuns
Yohei Sato
 
Visualize terms network in Lucene index
Visualize terms network in Lucene indexVisualize terms network in Lucene index
Visualize terms network in Lucene index
Koji Sekiguchi
 

Similar to いまさら聞けないJSONPのまとめ (19)

Jggug20120901pojojson
Jggug20120901pojojsonJggug20120901pojojson
Jggug20120901pojojson
 
WordPressAPI
WordPressAPIWordPressAPI
WordPressAPI
 
JSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めようJSON Schema で Web API のスキマを埋めよう
JSON Schema で Web API のスキマを埋めよう
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
RESTful Web API Design
RESTful Web API DesignRESTful Web API Design
RESTful Web API Design
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
RFC7951(JSON Encoding of Data Modeled with YANG)の勉強資料
RFC7951(JSON Encoding of Data Modeled with YANG)の勉強資料RFC7951(JSON Encoding of Data Modeled with YANG)の勉強資料
RFC7951(JSON Encoding of Data Modeled with YANG)の勉強資料
 
LODを使ったサイトとプラグインを作ってみた話[WordBenchOsaka]
LODを使ったサイトとプラグインを作ってみた話[WordBenchOsaka]LODを使ったサイトとプラグインを作ってみた話[WordBenchOsaka]
LODを使ったサイトとプラグインを作ってみた話[WordBenchOsaka]
 
Tokyowebmining5 yokkuns
Tokyowebmining5 yokkunsTokyowebmining5 yokkuns
Tokyowebmining5 yokkuns
 
Web技術勉強会 第26回
Web技術勉強会 第26回Web技術勉強会 第26回
Web技術勉強会 第26回
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習XPagesDay 2015 RESTの総復習
XPagesDay 2015 RESTの総復習
 
Oracle Labs 発! Parallel Graph AnalytiX(PGX)
Oracle Labs 発! Parallel Graph AnalytiX(PGX)Oracle Labs 発! Parallel Graph AnalytiX(PGX)
Oracle Labs 発! Parallel Graph AnalytiX(PGX)
 
Visualize terms network in Lucene index
Visualize terms network in Lucene indexVisualize terms network in Lucene index
Visualize terms network in Lucene index
 
PHP on Cloud
PHP on CloudPHP on Cloud
PHP on Cloud
 
codeless/serverless develop
codeless/serverless develop codeless/serverless develop
codeless/serverless develop
 
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティスコンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
 
Pjax1
Pjax1Pjax1
Pjax1
 

More from Yujiro Araki

Websocketのお絵かきチャットサンプル
Websocketのお絵かきチャットサンプルWebsocketのお絵かきチャットサンプル
Websocketのお絵かきチャットサンプル
Yujiro Araki
 
MTDDC Meetup Tokyo 2011:もっとディープにMovable Type
MTDDC Meetup Tokyo 2011:もっとディープにMovable TypeMTDDC Meetup Tokyo 2011:もっとディープにMovable Type
MTDDC Meetup Tokyo 2011:もっとディープにMovable Type
Yujiro Araki
 
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理
Yujiro Araki
 
Theme Framework in Depth - MT DDC Tokyo
Theme Framework in Depth - MT DDC TokyoTheme Framework in Depth - MT DDC Tokyo
Theme Framework in Depth - MT DDC Tokyo
Yujiro Araki
 
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作
Yujiro Araki
 

More from Yujiro Araki (9)

Movable Typeで承認ワークフロー
Movable Typeで承認ワークフローMovable Typeで承認ワークフロー
Movable Typeで承認ワークフロー
 
MovableTypeテンプレートタグのまとめ
MovableTypeテンプレートタグのまとめMovableTypeテンプレートタグのまとめ
MovableTypeテンプレートタグのまとめ
 
Movable Type カスタムフィールドのまとめ
Movable Type カスタムフィールドのまとめMovable Type カスタムフィールドのまとめ
Movable Type カスタムフィールドのまとめ
 
Websocketのお絵かきチャットサンプル
Websocketのお絵かきチャットサンプルWebsocketのお絵かきチャットサンプル
Websocketのお絵かきチャットサンプル
 
MTDDC 2012
MTDDC 2012MTDDC 2012
MTDDC 2012
 
MTDDC Meetup Tokyo 2011:もっとディープにMovable Type
MTDDC Meetup Tokyo 2011:もっとディープにMovable TypeMTDDC Meetup Tokyo 2011:もっとディープにMovable Type
MTDDC Meetup Tokyo 2011:もっとディープにMovable Type
 
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作 - バージョン管理
 
Theme Framework in Depth - MT DDC Tokyo
Theme Framework in Depth - MT DDC TokyoTheme Framework in Depth - MT DDC Tokyo
Theme Framework in Depth - MT DDC Tokyo
 
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作
MT DDC Tokyo(テーマ編):テーマを使った手間いらずなサイト制作
 

いまさら聞けないJSONPのまとめ