JSONP跨域獲取JSON資料(含jQuery方法)——李帥醒部落格
JSONP跨域獲取JSON資料(含jQuery方法)——李帥醒部落格
首先我要強調JSONP和AJAX沒有半毛錢關係,別把他們混淆!!!只不過他們都是從後臺獲取資料的方法!
前言:
說到AJAX就會不可避免的面臨兩個問題,第一個是AJAX以何種格式來交換資料?第二個是跨域的需求如何解決?這兩個問題目前都有不同的解決方案,比如資料可以用自定義字串或者用XML來描述,跨域可以通過伺服器端代理來解決。
但到目前為止最被推崇或者說首選的方案還是用JSON來傳資料,靠JSONP來跨域。
JSON和JSONP雖然只有一個字母的差別,但其實他們根本不是一回事兒:JSON是一種資料交換格式,而JSONP是一種依靠開發人員的聰明才智創造出的一種非官方跨域資料互動協議。我們拿最近比較火的諜戰片來打個比方,JSON是地下黨們用來書寫和交換情報的“暗號”,而JSONP則是把用暗號書寫的情報傳遞給自己同志時使用的接頭方式。看到沒?一個是描述資訊的格式,一個是資訊傳遞雙方約定的方法。(這段話來自網路);
下面來個小案例,通過JSONP跨域從後臺獲取資料。
案例一:
如下,這是後臺給你的一個註冊流程說明,你需要按照他提供的介面,和需要的資料,不過這些都是你們事先協商好的。
- 登入註冊流程說明:
- 服務地址: http://10.0.164.251/courseB/jQuery/Day6/user.php
- 請求方式為 POST 請求
- 登入註冊使用jsonp
- jsonp的引數名稱為:userCallback
- 登入或註冊 不管 成功與失敗 均以彈框方式告知使用者
- 登入介面----
- 引數名稱/值:
- type : login
- username : 輸入框的使用者名稱
- password : 輸入框的密碼
- 返回資料格式:
- 成功:{
- status:0,
- msg : "login success"
- }
- 失敗:{
- status : 1,
- msg : "username or password is error"
- }
- 註冊介面----
- 引數名稱/值:
- type : reg
- username : 輸入框的使用者名稱
- password : 輸入框的密碼
- 返回資料格式:
- 成功:{
- status:0,
- msg : "register success"
- }
- 失敗:{
- status : 2,
- msg : "register error"
- }
- $(".Login").on("click",function(ev){
- ev.preventDefault();
- var use=$('.user').val();//這些是我HTML頁面上表單資料
- var pwd=$(".pass").val();
- $.ajax({
- url: "http://10.0.164.251/courseB/jQuery/Day6/user.php", //後臺給的介面
- type:"post",<span style="white-space:pre"> </span>//請求方式
- dataType: "jsonp",<span style="white-space:pre"> </span>//<span style="font-family: Verdana, "Lucida Grande", Arial, Helvetica, sans-serif;">jsonp的引數名稱為:userCallback(和後臺商量好的)</span>
- jsonp: "userCallback",<span style="white-space:pre"> </span>
- jsonpCallback: "data", <span style="white-space:pre"> </span>
- data: {<span style="white-space:pre"> </span>//後臺需要的資料
- <span style="white-space:pre"> </span>type:"login",
- username:use,
- password:pwd
- },
- success: test
- })
- })
- function test(res) {
- console.log("jsonpCallback輸出:"+ res)<span style="white-space:pre"> </span>後臺返回的資料
- }
案例二:
前端頁面:
- <script type="text/javascript">
- document.querySelector("button").onclick=function(){
- alert();
- document.forms["myForm"].submit;
- }
- var btn = document.querySelector("button");
- //Ajax與JSONP沒有任何關係
- //但不成文的說法都叫做原生Ajax使用JSONP
- //JSONP 一種被創造出來的資料交換方法
- //利用script標籤的src屬性沒有跨域限制的特點
- //在使用JSONP時,要求前端與後臺必須統一回撥函式名稱
- //例如在前端傳送到後臺 引數為:?a=b&c=d&callback=fun 後臺必須解析引數名為callback的值
- //並且輸出fun(...)
- //前端也必須構建一個函式名為 function fun(...){...}的函式 用於響應後臺的輸出
- btn.onclick = function() {
- var url = "http://10.0.164.235/domain/ajax/jsonp_myCallback.php?user=admin&pass=123&myCallback=myFun";
- //特別注意,地址後面接的是一個函式,和後臺商量好的函式
- var script = document.createElement("script");
- script.setAttribute("src", url);
- document.getElementsByTagName("head")[0].appendChild(script);
- //新增後就可以移除,
- document.getElementsByTagName("head")[0].removeChild(script);
- }
- function myFun(res) {
- console.log("回撥函式被呼叫了");
- console.log(res);<span style="white-space:pre"> </span>//這個函式裡的引數是從後臺傳入過來的資料。
- }
- </script>
- <?php
- //獲取回撥函式的名稱
- $cbName = $_GET["callback"]; //callback必須與前端名字一樣
- $user = $_GET["user"];
- $pass = $_GET["pass"];
- $arr = array("user" => "我的使用者名稱是{$user}", "pass" => "我的密碼是:{$pass}");
- echo $cbName . "(" . json_encode($arr) . ")";<span style="white-space:pre"> </span>//這裡就類似於呼叫之前商量好的函式,而傳遞的引數則是後臺給你的資料。
- ?>
相關文章
- jsonp跨域獲取資料實現百度搜尋JSON跨域
- jquery 之 jsonp 與 laravel 實現跨域jQueryJSONLaravel跨域
- Python獲取jsonp資料PythonJSON
- jqGrid獲取json資料方法JSON
- jsonp跨域資源引起CORBJSON跨域ORB
- 跨域請求之jQuery的ajax jsonp的使用解惑跨域jQueryJSON
- vue專案中jsonp跨域獲取qq音樂首頁推薦VueJSON跨域
- jsonp跨域封裝JSON跨域封裝
- JavaScript跨域呼叫、JSONPJavaScript跨域JSON
- 原生JS和jQuery分別使用jsonp來獲取“當前天氣資訊”jQueryJSON
- 深入跨域問題(3) – 利用 JSONP 解決跨域跨域JSON
- 深入跨域問題(3) - 利用 JSONP 解決跨域跨域JSON
- JSONP 跨域原理及實現JSON跨域
- php 支援jsonp跨域請求PHPJSON跨域
- Python爬取CSDN部落格資料Python
- JSON形式跨域JSON跨域
- jQuery、ajax新增Json資料jQueryJSON
- 【跨域】jsonp看完這篇文章就夠了跨域JSON
- 簡單的實現jsonp跨域請求JSON跨域
- 跨域總結(jquery,php)跨域jQueryPHP
- jQuery獲取點選td單元格的值jQuery
- 搞定所有的跨域請求問題: jsonp & CORS跨域JSONCORS
- 關於跨域和JSONP的一些理解跨域JSON
- spring-boot + jsonp 解決前端跨域問題SpringbootJSON前端跨域
- VuePress 部落格之 SEO 優化(五)新增 JSON-LD 資料Vue優化JSON
- jquery和bootstrap獲取checkbox選中的多行資料jQueryboot
- 前端常用的echart獲取地圖json方法前端地圖JSON
- 讀取JSON資料JSON
- web前端跨域解決方案JSONP,CORS,NGINX反向代理Web前端跨域JSONCORSNginx
- 【小哥哥, 跨域要不要了解下】JSONP跨域JSON
- 跨域是什麼?跨域請求資源有哪些方法?跨域
- JQuery獲取input type=jQuery
- 關於如何獲取資料的方法
- 微信小程式呼叫騰訊地圖獲取jsonp資料 解析詳細地址資訊微信小程式地圖JSON
- 【JavaScript】通過封裝自己的JSONP解決瀏覽器的跨域問題(Ajax跨域)JavaScript封裝JSON瀏覽器跨域
- jq jsonp跨域報錯之“Unexpected token :”的解決方案JSON跨域
- jQuery : ajax獲取Status CodejQuery
- jquery獲取元素節點jQuery
- jQuery Ajax 跨域前端實現登入jQuery跨域前端