Ajaxã®ã¯ãã¹ãµã¤ãéä¿¡ãJSONPã使ããªãã§ãã£ã¦ã¿ãã
jQueryãªã©ã使ãAjaxã§éä¿¡ãªã©ããã¦ããã¨ãä»ã®ãµã¼ãããç´æ¥JSONãåããã便å©ãªã®ã«ã¨æã£ãããã¾ãã
é常ã¯ãããã£ãã¨ãã¯JSONPãªã©ã使ãã®ã§ããããã£ã¨æ¥½ãªæ¹æ³ã¯ç¡ããã®ãã¨æ¢ãã¦ããã¨ãããAccess-Control-Allow-Originãªããã®ãHTTPãããã¼ã«å
¥ããã°ã§ããï¼ãã¨ããè¨äºããã£ãã®ãæãåºããå¤ä¸ã«ããããã¨è©¦ãã¦ã¿ã¾ããã
å ã«çµè«ãæ¸ãã¦ããã¨ãåé ã®ä¾ããä»ãµã¼ãããç´æ¥JSONãåããã«ã¯ãä»ã®ãµã¼ãã¼ãè¿ãã¦ããResponseã®ãããã¼é¨åã«ãAccess-Control-Allow-Origin:"*"ãã¨å ¥ã£ã¦ããã¨ãåãåã£ããã©ã¦ã¶ã¯JSONãå¦çãã¦ããã¾ãã
ãã®ãã¯ããã¯ã¯ç¹æ®ãªãã¯ããã¯ã§ã¯ãªããいたって正攻法とのことでしたããã®ãããã»ã¨ãã©ã®ãã©ã¦ã¶ã§åããå¦çããã¾ããè¤æ°ã®Webãµã¼ãã®ãããã調æ´ãããã¨ãã§ããã®ã§ããã°ãæ´»ç¨ãããã¨ã§ã¨ã¦ã楽ã«Ajaxã®ã¯ãã¹ãµã¤ãéä¿¡ãå®è£ ãããã¨ãã§ãã¾ãã伿¥å ã·ã¹ãã ã§JSONPã使ã£ã¦ãã¼ã¿ã®åå¾ããã¦ãããããªå ´é¢ã§ã¯ãå å使ãããã¯ããã¯ãªã®ã§ããã²æ´»ç¨ãã¦ã¿ã¦ãã ããã
ããã§ã¯ãGistã«å ¬éããã½ã¼ã¹ã¨Cacooã§æ¸ããå³ãå ã«ãä½ãã©ãããã°è¯ãã®ãã説æãã¦ã¿ã¾ãã
ã¨ãããã¨ã§ãã¾ãã¯å³ãã覧ä¸ããã
ãã©ã¦ã¶ã§Server1ã«ã¢ã¯ã»ã¹ããindex.htmlãåå¾ãã¾ããä¸ã«ã¯jQueryã§$.getJSONãå¼ã³åºãJavaScriptãæ¸ããã¦ãã¾ãã
æåã¯index.htmlã¨åããµã¼ãããjsonãåå¾ãã¾ãããã®æã¯getã使ã£ã¦ãã¾ãããã¡ããindex.htmlã¨åããµã¼ã(åä¸ãã¡ã¤ã³)ã§ããã®ã§ãæ£å¸¸ã«ãªã¯ã¨ã¹ããé£ã³ããªãã©ã¤ãè¿ã£ã¦ãã¦jQueryãåãåã£ãçµæãå¦çãã¦ããã¾ãã
次ã«ãindex.htmlã®jQueryããServer2ã«ãªã¯ã¨ã¹ããé£ã°ãã¾ãããã®æãã¦ã£ãããªã¯ã¨ã¹ãèªä½ãé£ã°ãªãã®ãã¨æã£ã¦ãã®ã§ãããã©ããããªã¯ã¨ã¹ãã¯é£ã¶ããã§ããããã¦ãServer2ã¯ãªã¯ã¨ã¹ãã«å¾ããindex.jsonã¨ãã¦JSONãè¿ä¿¡ãã¾ããï¼ãã¡ããJSONãªã®ã§JSONPã¨ãã¦å¦çããããã«å¿ é ã®callback颿°ãªã©ã¯å ¥ã£ã¦ã¾ããï¼
ãã©ã¦ã¶ã¯Server2ããã®ãªãã©ã¤ãåãåãã¨ãHTTPããã(Responseã®HTTPããã)ã確èªãã¾ããããã¦ããã«ãAccess-Control-Allow-Origin:"*"ãã¨æ¸ããã¦ããã¨ããã©ã¦ã¶ã¯Javascriptã¨ãã¦å¦çãè¡ãã¾ããçµæãJSONã¨ãã¦åãåã£ãå 容ã表示ããããã¨ã«ãªãã¾ãã
ç§ã¯ãã®ãAccess-Control-Allow-Originãã¯ãã¦ã£ããServer1ããéãããindexhtmlã®æç¹ã§å ¥ã£ã¦ããªãã¨ã§ããªããã®ã ã¨æã£ã¦ã¾ããããæ£è§£ã¯Server2ã®æ¹ã§ããã
ãã¦ãä»åã¯ãã®æ§æã2å°ã®PCã使ããRails3ã¨jQueryã使ã£ã¦ç°å¢ãä½ã£ã¦ã¿ã¾ããWebãµã¼ãã¯Webrickã使ã£ããæè»½ç°å¢ã§ããï¼ãªãããè²ã ã¨èª¿ã¹ã¦ã¿ãã¨PHPã§ã®ãµã³ãã«ã¯ãã£ãã®ã§ããRailsãããã¾ããã§ãããã¾ããjQueryã使ãããXMLãªãã¡ããï¼ã¨æ£ããæ¸ãã¦ããæ å ±ã°ãããï¼
以ä¸ãGistã«å ¬éãã¦ãã½ã¼ã¹ãè²¼ãä»ãã¦ããã¾ãã
ã¾ãã¯Server1ã®index.htmlã¨test.jsonãå¦çããã³ã³ããã¼ã©ã¼
次ã«index.htmlã¨ãã¦ãã©ã¦ã¶ã«éãããView
index.htmlããåå¾ãããåä¸ãã¡ã¤ã³ã®JSONã®View
次ã«ãã¯ãã¹ãã¡ã¤ã³å
ã«ãããServer2ã®JSONãè¿ãã³ã³ããã¼ã©ã¼
Server2ããè¿ãããJSONã®View
ããã¦æå¾ããä»åä¸çªéè¦ã¨ãªãHTTPãããã調æ´ããã³ã³ããã¼ã©ã¼
ãªããæ¬å½ã«ã¢ã¯ã»ã¹ã§ããããã«ãªãã試ããããæå¾ã®application_controllerã®
before_filter :allow_cross_domain_access
ã
# before_filter :allow_cross_domain_access
ã¨æåã¯ãã¦ããã¨è¯ãã¨æãã¾ããããã¦ããã®å¾ã³ã¡ã³ãã¢ã¦ããå¤ãæãã§ãã
ãã¨Rails3ã§ã¯ç¹ã«æ°ã«ããªãã¦ãããã®ã§ããRails2ã使ã£ã¦ããã®å®é¨ãããå ´åã¯routes.rbã«ã¦
map.connect ':controller/:action.:format'
ãªã©ã¨ããªãã¨ã¨ã©ã¼ã«ãªãã¾ãã®ã§ããæ³¨æããããã©ã§ã¯
map.connect ':controller/:action/:id.:format'
ã«ãªã£ã¦ã¾ãã
ãã®å®é¨ã®ãã¤ã³ãã¯
- Chromeã使ãããã£ããããã¼ãã¼ã«ã使ãã¾ãããã
- Firefoxã¨Firebugã§ãè¯ãã¨æãã¾ãã
- è¦ãã¹ãã¨ããã¯ãNetworkãã§éä¿¡ãçºçãã¦ããã
- ããã«ãConsoleããè¦ããã¨ã§ãå¦çãããªãï¼å¦çãããã確èªã§ãã¾ã
ãªããããã¯ããã¾ã§XHRã®ã¯ãã¹éä¿¡ã ããç®çã¨ãã¦ãã¾ãã調ã¹ãã¨ããã§ã¯ãCookieã両æ¹ã®ãã¡ã¤ã³ã§å ±æãããªã©ããããå ´åã¯ãAccess-Control-Allow-Origin:"*"ãã¨ããã«ã*ãé¨åã«æ£ããç¸æãã¡ã¤ã³ãæ¸ããªãã¨ãã¾ããããªãã¨ããè¨äºãæãã¾ããããã®ç¹ã«ã¤ãã¦ã¯ãä»å確èªãã¦ããªãã®ã§è»½ãæ¸ãã¦ããç¨åº¦ã«ãã¦ããã¾ãã
ã¨ãããã¨ã§ï¼
JSONãéã£ã¦ãããå¤é¨ã®ãµã¼ãã®HTTPãããã«ãAccess-Control-Allow-Origin:"*"ããå ¥ããããã®ã§ããã°ãJSONPã使ããªãã¦ãããªããã
ã¨ããçµè«ã¨ãªãã¾ããã
ãããããã§å¯ãããããã£ããï¼