靜態(tài)網(wǎng)站如何利用云函數(shù)SCF + API網(wǎng)關(guān)訪問自定義后端接口,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站建設、成都網(wǎng)站制作、漳縣網(wǎng)絡推廣、小程序設計、漳縣網(wǎng)絡營銷、漳縣企業(yè)策劃、漳縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供漳縣建站搭建服務,24小時服務熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
小編介紹使用全靜態(tài)頁面的網(wǎng)站如何利用SCF+API服務實現(xiàn)簡單的后端接口,并提供了一個 Python 出題器的實例演示。
相關(guān)服務介紹:
云函數(shù)(Serverless Cloud Function,SCF)是騰訊云為企業(yè)和開發(fā)者們提供的無服務器執(zhí)行環(huán)境,幫助您在無需購買和管理服務器的情況下運行代碼。 API 網(wǎng)關(guān)(API Gateway)是 API 托管服務,提供 API 的完整生命周期管理,包括創(chuàng)建、維護、發(fā)布、運行、下線等。
前幾天為我家小盆友用 Python 寫了個簡單的自動數(shù)學題出題器,小家伙十分好奇,隔三差五的就要來讓我演示一番 。只是每次都要拿本出來輸命令給他看實在有些麻煩,于是想著能不能加個前端頁面調(diào)用,直接打開頁面就能看到運行效果。
作為一個行動派派,我目標鎖定了用 SCF+API的方式,也就是現(xiàn)在很????的 serveless 方案。最大的好處當然是不用再伺候服務器了,少了很多搭建的麻煩。而且這個按實際使用量計費,對于小網(wǎng)站再適合不過了。
下面介紹下要怎么實現(xiàn)了。首先,你要有個騰訊云賬號,然后參考????的簡單步驟:
創(chuàng)建云函數(shù) SCF。
創(chuàng)建 API Gateway,后臺指定調(diào)用步驟 1 建好的云函數(shù)。
API gateway中 新建密鑰,使用計劃,實現(xiàn)訪問控制并發(fā)布。
寫前端頁面,調(diào)用剛寫好的 API。
測試,解決各種 bug,大功告成!
照著這個文檔 云函數(shù)快速入門 按里面的步驟來創(chuàng)建自己業(yè)務函數(shù)。第一次可以選擇使用控制臺創(chuàng)建函數(shù),運行環(huán)境中選擇自己熟悉的編程語言,當前支持 python, php, golang, java, nodejs幾種,然后就可以在函數(shù)代碼下愉快的開始了。這里以運行環(huán)境 Python3.6為例。默認的入口函數(shù)是 index.main_handler
,有兩個輸入?yún)?shù):
event:可以獲取觸發(fā)源的消息 - 主要用來獲取傳入?yún)?shù)。
context:可以獲取本函數(shù)的環(huán)境及配置信息。
不清楚參數(shù)里有什么的,或怎么用的,可以直接打印出來看看,都是 dict 類型,一目了然。建議加上傳入?yún)?shù)檢查和限制,畢竟我們不知道調(diào)用接口的人會傳些什么奇怪的東西。返回類型包裝成 json 格式,對前端調(diào)用更友好。給出改好的代碼????:
# -*- coding: utf8 -*- import sys, getopt, random import json def main_handler(event, context): print("Received event: %s" % event) print("Received context: %s" % context) params = event["queryString"] return auto_cal_generator(int(params["limit"]), int(params["op_count"]), params["op_type"].split(","), int(params["total"])) def auto_cal_generator(limit=100, op_count=1, op_type=["+"], total=100): if limit>999 or op_count>9 or total>99: return "exceed max input limit" res = {} res["msg"] = "Here are today's %d works, good luck!" % total questions = [] l = len(op_type)-1 for j in range(0, total): up = limit question = "" for i in range(0, op_count+1): num = 0 if i == 0: num = random.randint(1,max(1,min(limit,up))) question = "%s%d" % (question, num) up -= num continue op = "+" if limit - up > 0: op_i = random.randint(0,l) op = op_type[op_i] question = "%s%s" % (question, op) if op =="+": num = random.randint(1,max(1,min(limit,up))) up -= num elif op == "-": num = random.randint(1,max(limit-up, 1)) up += num else: print("operator error: %s" % op) sys.exit(1) question = "%s%d" % (question, num) questions.append("%d: %s=" % (j+1, question)) res["questions"] = questions return json.dumps(res)
寫完 code 后當然不能忘了最重要的測試工作,代碼輸入框下就是測試的入口,需要創(chuàng)建測試模板。系統(tǒng)已經(jīng)預置了好幾種模板類型,直接拿來改成你需要的就好。我們用 API Gateway 事件模板為原型修改剛寫好的出題器的測試模板。由于我們 code 獲取的是 event 里的 queryString
,這里只用修改里面的 queryString
這塊:
"queryString": { "op\_type" : "+,-", "op\_count" : 2, "limit":100, "total":10 },
創(chuàng)建完測試模板后,點擊左側(cè)測試,瞬間返回結(jié)果:
返回結(jié)果 "{\"msg\": \"Here are today's 10 works, good luck!\", \"questions\": \"1: 76-4-44=\", \"2: 52-42+67=\", \"3: 95+4-50=\", \"4: 84-78-1=\", \"5: 29-20-9=\", \"6: 19+37+38=\", \"7: 93-53+57=\", \"8: 80+7+7=\", \"9: 90-74-11=\", \"10: 7+34+52=\"}"
結(jié)果下方還有執(zhí)行摘要和執(zhí)行日志,方便調(diào)試。
云函數(shù) SCF 寫完后,如果想要能通過網(wǎng)絡 http(s) 請求直接訪問,就要為其添加觸發(fā)方式為 API 網(wǎng)關(guān)觸發(fā)器。同時強烈建議將鑒權(quán)方法置為 API 網(wǎng)關(guān)密鑰對。然后就會在 API Gateway 下自動創(chuàng)建出一個對應的 service API。這一步如果遇到權(quán)限問題無法自動創(chuàng)建 API 的話,也不要著急,可以直接在 API gateway 的控制臺操作。
參考:API 網(wǎng)關(guān)快速入門。
創(chuàng)建 API 時注意將鑒權(quán)類型改成密鑰對。下方有個支持CORS的選項,如果需要跨域訪問就勾上,反之可以忽略。設置完需要接收的參數(shù)后,在下一步的后端配置中選后端類型為 cloud function后,選中剛建好的云函數(shù),就做好了這兩者的關(guān)聯(lián)。
建好 API 后,來到對應服務下的管理 API標簽就能看到剛建好的 API。在列表的右側(cè)有調(diào)試入口,千萬不要忘了點進去做下測試。測試完成后,再到服務頁完成發(fā)布,這樣 API 就可以被訪問到了。
然后,就來到了相當重要但也容易被忽略的訪問控制這步。在前面我們已經(jīng)選擇了密鑰對的方式作為鑒權(quán)類型。雖然有密鑰泄露的風險,但對于小網(wǎng)站來說這個驗證也是足夠了,記得保存好密鑰并定期修改就好。
之后的步驟就是創(chuàng)建密鑰對,創(chuàng)建使用計劃綁定密鑰對,再把使用計劃綁定服務或 API。下面直接甩出文檔:使用計劃。使用計劃中除了可以綁定密鑰對,還可以進行流量控制,可按需設置。
配置完后端服務后,要解決的就是訪問的問題了。由于沒錢供服務器,用的是靜態(tài)頁面托管的方式建的站。前端直接 ajax 訪問 API 來獲取結(jié)果。參考文檔在此:密鑰對認證,如何生成簽名(里面給出了用不同語言生成簽名的例子)。
由于沒寫前端好多年,對前端的認知還停留在 js 和 jquery 階段,這里只能給出改好的 jquery 寫法。用的是 crypto-js 加密。
// function getHeader(){ var nowDate = new Date(); var dateTime = nowDate.toGMTString(); var SecretId = '****'; var SecretKey = '****'; var source = 'your_source'; var auth = "hmac id=\"" + SecretId + "\", algorithm=\"hmac-sha1\", headers=\"x-date source\", signature=\""; var signStr = "x-date: " + dateTime + "\n" + "source: " + source; var sign = CryptoJS.HmacSHA1(signStr, SecretKey) sign = CryptoJS.enc.Base64.stringify(sign) sign = auth + sign + "\"" var header = {"Source": source , "X-Date": dateTime , "Authorization":sign} return header } function getQ(){ $.ajax({ url: "https://xxxx/xx", type: "get", data:{ "op_count" : 1, "op_type" : "+,-", "limit" : 100, "total" : 10 }, dataType: "json", crossDomain: true, headers: getHeader(), success: function (data) { if (data.errorCode < 0){ //deal function error: data.errorMessage return } data= $.parseJSON(data); //show result in page }, error: function(jqXHR, textStatus, errorThrown){ //deal api error } }) }
如果在前面創(chuàng)建 API gateway 的 service 時候沒有指定自定義域名,或是自定義域名和調(diào)用頁面的域名不是同一個,就會涉及到跨域的問題。解決跨域問題傳統(tǒng)的方法可以用 jsonp。但它沒辦法在 request 的 Header 里加參數(shù),也就傳不了鑒權(quán)所需的字段。所以這里只能用 CORS來解決跨域:
對于服務端,只要前面建 API 的時候勾選了支持 CORS選項,就會自動開啟,參考 API 控制臺相關(guān)問題 。對于客戶端,在 ajax 參數(shù)中設置 crossDomain: true
就可以了。
最后,解決一下頁面上的 bug,測試通過后就大功告成了!
看完上述內(nèi)容,你們掌握靜態(tài)網(wǎng)站如何利用云函數(shù)SCF + API網(wǎng)關(guān)訪問自定義后端接口的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!