首先想要说一下,为什么要把云函数与API网关进行结合?
我们通常用云函数SCF写一个函数应用,这个函数应用可能多种多样,例如之前介绍的包括OJ系统的判题功能、通过NLP实现文本摘要功能......那么,怎么把这些功能简单快速的结合到实际项目中,尤其是Web项目中呢?本文通过一个简单的小例子实现云函数SCF与API网关的结合,算作抛砖引玉,希望大家在自己的Web项目中,可以通过SCF+API网关实现更多功能。
任务说明
通过SCF编写一个两个爬虫程序,分别是通过IP地址获得IP归属地信息、通过地址获得天气预报信息等。通过API网关作为触发器,实现一个简单的对外接口。
该功能主要作用是作为网站的一个接口,保证用户访问网站时,可以在适当的位置看到今天本地区的天气信息。
任务流程
爬虫1实现:获得IP地址
通过百度搜索IP地址,可以看到这样一个小工具:
通过输入IP地址,点击查询可以获得到地址信息。通过抓包可以获得API:
https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=113.57.215.184&co=&resource_id=6006&t=1559922221313&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb=jQuery110205516131051897397_1559921486295&_=1559921486372
结果如下:
对地址进行简化:
https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=113.57.215.184&resource_id=6006&format=json
简化后结果成为Json形式:
编写Python代码实现:
import urllib.request
import ssl
import json
ssl._create_default_https_context = ssl._create_unverified_context
location_temp = json.loads(urllib.request.urlopen(
"https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=113.57.215.184&resource_id=6006&format=json").read().decode(
"gbk"))["data"][0]["location"]
location = location_temp.split(" ")[0] if " " in location_temp else location_temp
print(location)
运行结果:
通过对页面分析,我们可以看到天气信息在网页源码中可以提现:
也就是说,我们可以通过简单的页面分析,就能获得到天气数据:
import urllib.request )[1].split('title="">')[1].split(' '
import urllib.parse
url = "http://www.baidu.com/s?wd=" + urllib.parse.quote("湖北省武汉市天气")
page_source = urllib.request.urlopen(url).read().decode("utf-8").replace("\n", "").replace("\r", "")
weather = page_source.split('
temp = page_source.split('
运行结果:
新建云函数:
保存之后,在测试的时候,选择API网关作为触发器,进行测试:
测试之后,可以看到结果,便于我们对起进行基本分析:
经过分析可以看到Event中有:
可以获得这个IP地址:
# -*- coding: utf8 -*-
import json
def main_handler(event, context):
print(event["requestContext"]["sourceIp"])
运行结果:
# -*- coding: utf8 -*- )[1].split('title="">')[1].split(' '
import json, ssl
import urllib.request
import urllib.parse
ssl._create_default_https_context = ssl._create_unverified_context
def get_loaction(ip):
location_temp = json.loads(urllib.request.urlopen("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=" + ip + "&resource_id=6006&format=json").read().decode("gbk"))["data"][0]["location"]
return location_temp.split(" ")[0] if " " in location_temp else location_temp
def get_weather(address):
url = "http://www.baidu.com/s?wd=" + urllib.parse.quote(address + "天气")
page_source = urllib.request.urlopen(url).read().decode("utf-8").replace("\n", "").replace("\r", "")
weather = page_source.split('
temp = page_source.split('
测试结果:
选择API网关:
在与云函数相同区域,建立:
保存之后会提示我们进行API配置:
点击新建:
因为本文仅是做一个简单的Demo,所以在此处,我就进行简单配置,例如鉴权等都选择了免鉴权,但是在实际中,我还是推荐大家,进行鉴权,这样更安全,也避免资源被盗用等,除此之外,其他各个参数都需要根据自己需求而定,本文仅是抛砖引玉:
配置完成之后,发布测试环境进行测试:
测试发布完成之后,我们通过浏览器进行一下简单测试:
复制地址,并添加我们之前的路径:
至此,我们完成了一个API网关与SCF结合的小例子。
额外想说
云函数是一个函数级别的应用,我们可以将它应用在很多领域,例如做Web开发、IOT等,但是云函数本身自己很难完成一个功能,需要和周边的产品配合,本文主要介绍与API网关结合做一个获取天气的HTTP接口。其实仔细想一下,我们是不是可以通过SCF与API网关结合,实现一个Web后端呢?
以一个博客系统为例:
前段使用Vue.js等框架进行开发,所有的后端逻辑,包括数据库的增删改查,包括某些小功能点的实现,全部用云函数来实现?这样,只需要找一个虚拟空间或者腾讯云的COS,就可以完成前端的部署,而后端的服务器配置、面对用户激增的服务器运维等,都交给云函数+相关产品来实现,这样会大大节约资源,降低成本。
总结来说,合理利用云函数,不仅可以节省项目搭建时间,还能节约资源、降低成本、提高效率。
【SCF实践系列】是腾讯云Serverless团队策划的SCF场景落地系列案例指导,旨在帮忙开发者了解SCF可应用的场景及其实现方式。同时,我们也欢迎大家分享、反馈SCF相关技术实践、产品体验问题及建议等,一经选用,即有精美礼品送,欢迎大家积极投稿~
【投稿邮箱】[email protected]
活动推荐
Hello Serverless 技术沙龙「深圳站」来了!
这场沙龙将围绕腾讯云 Serverless 2.0 的运行原理、应用场景,腾讯云云函数的架构设计、冷启动优化、本地开发调试,以及 Serverless 在乐凯撒新餐饮服务上的应用实践,从 0 到 1 介绍 Serverless 2.0,与开发者一同交流未来的无服务器形态。
活动时间:2019 年 8 月 17 日 13:00-17:30
活动地点:深圳市南山区深南大道 10000 号腾讯大厦 2F 多功能厅
点击文末 阅读原文 即可报名参会