国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > WEB開發(fā) > 正文

變臉式應用 - 調(diào)用后端接口

2024-04-27 15:07:50
字體:
供稿:網(wǎng)友

調(diào)用后端接口是筋斗云框架提供的兩大核心功能之一。

[任務]

繼續(xù)hello頁面的例子,要求每次進入頁面時,不是固定的顯示”hello, world”,而是需要根據(jù)服務端的返回內(nèi)容來顯示hello的內(nèi)容,比如”hello, skys”或是”hello, jdcloud”。

我們先定義一個叫做”hello”的交互接口,由前端發(fā)起一個HTTP GET請求,比如:

http://myserver/myPRoject/api.php?ac=hello

如果調(diào)用成功,后端返回JSON格式的數(shù)據(jù)如下:

[0, "jdcloud"]

其中0是返回碼,表示調(diào)用成功。如果調(diào)用失敗,可返回:

[99, "對不起,服務器爆炸了"]

以上就是一個符合筋斗云接口規(guī)范的簡單例子(稱為業(yè)務查詢協(xié)議-BQP),在成功調(diào)用時應返回[0, data],在調(diào)用失敗時應返回[非0, 錯誤提示信息]

有了清晰的接口定義,前后端就可以并行開發(fā)了。 在前端,我們把頁面稍作修改以動態(tài)顯示hello的內(nèi)容:

<div class="bd"> <p>Hello, <span id="what"></span></p> </div>

再寫一段邏輯,每當進入頁面時調(diào)用hello接口并顯示內(nèi)容,我們選擇onBeforeShow回調(diào)來做這件事:

function initPageHello() { var jpage = $(this); jpage.on("pagebeforeshow", onBeforeShow); function onBeforeShow() { callSvr("hello", api_hello); } function api_hello(data) { jpage.find("#what").html(data); }}

callSvr是框架提供的一個重要函數(shù),它封裝了Ajax調(diào)用的細節(jié),完整的函數(shù)原型為:

callSvr(ac, param?, fn?, postParam?, options?);

其中,ac是調(diào)用接口名,fn是回調(diào)函數(shù),param和postParam分別是URL參數(shù)和POST參數(shù)。除ac外,其它參數(shù)均可省略。例如

callSvr("hello");callSvr("hello", {id: 1}); // URL: hello?id=1callSvr("hello", {id: 1}, api_hello); // function api_hello(data) {}callSvr("hello", api_hello, {name: "hello"});

回調(diào)函數(shù)api_hello僅在成功時被調(diào)用,參數(shù)data是實際數(shù)據(jù),即[0, data]中的data部分,不包括返回碼0。 當調(diào)用失敗時,框架會統(tǒng)一處理,顯示錯誤信息,無須操心。

調(diào)用模擬接口

上面代碼寫好了,后端接口還沒做好怎么測試?

筋斗云支持模擬接口返回數(shù)據(jù)。 在mockdata.js中,可以設(shè)置接口的模擬返回數(shù)據(jù):

MUI.mockData = { ... "hello": [0, "jdcloud"]}

此處還可以用函數(shù)做更復雜的基于參數(shù)的模擬,詳見API文檔,查詢MUI.mockData

運行H5應用,進入hello頁面,看看是不是可以正常顯示了?

可以動態(tài)修改模擬數(shù)據(jù),在控制臺中輸入:

MUI.mockData["hello"] = [0, "skys"]

然后從hello頁返回首頁,再進入hello頁,看看顯示內(nèi)容是不是變了?

再改一個出錯的試試:

MUI.mockData["hello"] = [99, "對不起,服務器爆炸了"]

進入hello頁,我們看到,調(diào)用失敗時,回調(diào)函數(shù)api_hello沒有執(zhí)行,而是框架自動接管過去,顯示出錯信息。

調(diào)用真實接口

在后端接口開發(fā)好后,我們可去掉對這個接口的模擬,直接遠程調(diào)用服務端接口。這需要配置好后端接口的地址。

我們用php寫一個簡單的符合筋斗云接口規(guī)范的后端實現(xiàn),通過名為”ac”的URL參數(shù)表示接口名,在server目錄中創(chuàng)建文件api.php如下:

<?php@$ac = $_GET['ac'];if ($ac == 'hello') { $what = "jdcloud @ " . time(); echo json_encode([0, $what]);}else { echo json_encode([1, "bad ac"]);}

配置好php的調(diào)用環(huán)境后,訪問

http://localhost/myproject/api.php?ac=hello

輸出類似這樣(根據(jù)時間動態(tài)變化):

[0,"jdcloud @ 1483526151"]

回到前端,我們在app.js中設(shè)置服務端接口地址:

$.extend(MUI.options, { serverUrl: "api.php", serverUrlAc: "ac" });

serverUrl選項設(shè)置了服務端的URL地址,因為我們將”api.php”放在與”index.html”同一目錄下,所以直接用相對路徑就可以了。serverUrlAc選項定義了接口名對應的URL參數(shù)名稱,即?ac={接口名}. 在mockdata.js中去掉對”hello”接口的模擬,刷新應用就可以看到調(diào)用后端的效果了。

如果前后端不在同一臺服務器上,則要將URL寫完整,如

serverUrl: "http://myserver/myproject/api.php";

注意:后端應設(shè)置好允許跨域請求。這里不做詳述。

以上講述的是符合筋斗云接口規(guī)范的接口調(diào)用設(shè)置,如果不符合該規(guī)范,請閱讀下一節(jié)“接口適配”。

接口適配

在上例中,假定了后端接口兼容筋斗云接口規(guī)范,例如返回格式為[0, jsonData][非0, 錯誤信息]。 如果接口協(xié)議不兼容,則需要做接口適配。

接口適配的目標是通過callSvr函數(shù)更加簡練地調(diào)用后臺接口,同時達到:

調(diào)用出錯統(tǒng)一處理,例如未認證錯跳轉(zhuǎn)到登錄頁,其它錯誤彈出錯誤提示框等。寫代碼時只需要處理調(diào)用成功后返回的數(shù)據(jù),不用每次調(diào)用都處理各種錯誤。

[任務]

適配以下接口協(xié)議規(guī)范,約定接口返回格式為:{code, msg, data}, 例如上例中的hello接口,調(diào)用成功時返回:

{ "code":"0", "msg":"success", "data":"jdcloud"}

失敗返回:

{ "code":"99", "msg":"對不起,服務器爆炸了"}

這時需要對callSvr進行適配,可以在app.js中,設(shè)置 MUI.callSvrExt如下:

MUI.callSvrExt['default'] = { makeUrl: function(ac) { return 'http://hostname/lcapi/' + ac; }, dataFilter: function (data) { if ($.isPlainObject(data) && data.code !== undefined) { if (data.code == 0) return data.data; if (this.noex) return false; app_alert("操作失敗:" + data.msg, "e"); } else { app_alert("服務器通訊協(xié)議異常!", "e"); // 格式不對 } } };

我們在mockdata.js中設(shè)置好模擬數(shù)據(jù)用于測試:

MUI.mockData = { "User.get": {code: 0, msg: "success", data: user}, "hello": {code: 0, msg: "success", data:"myworld"} ...}

上例中,User.get接口在顯示首頁是會調(diào)用,所以和”hello”接口一并模擬下。

測試接口調(diào)用:

callSvr("hello", console.log);或callSvrSync("hello");

callSvrSynccallSvr的同步調(diào)用版本,它直接等到調(diào)用完成才返回,且返回值就是調(diào)用成功返回的數(shù)據(jù)。

可以動態(tài)修改模擬數(shù)據(jù):

MUI.mockData["hello"] = {code: 99, msg: "對不起,服務器爆炸了"}

在接口適配完成后,應用層代碼不用去做任何修改。 進入頁面看看,是不是和上節(jié)的運行結(jié)果是一樣的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 赣州市| 万年县| 剑川县| 武强县| 维西| 龙口市| 河津市| 林口县| 丰顺县| 桓台县| 谷城县| 日照市| 石首市| 永和县| 静宁县| 昌吉市| 南丹县| 玛沁县| 永顺县| 正定县| 沙洋县| 西吉县| 城固县| 高清| 永登县| 漯河市| 扶余县| 光泽县| 安塞县| 吉隆县| 韩城市| 金乡县| 五台县| 包头市| 富源县| 莱州市| 黄石市| 年辖:市辖区| 屯昌县| 肇源县| 新源县|