要点
上一篇 Serverless-实现一个短网址服务(一)实现了一个生成短链接的云函数,这一篇完成后半部分,实现短链接的跳转。主要需要注意的内容有:
- 腾讯云函数的API调用中如何读取path中的参数
- 腾讯云函数中的集成响应和透传响应的区别
从请求的短链接获取真实url
如前文所属,我们生成的短链接是使用hashids库从整数id生成的,所以获取真实url的过程也非常简单,只需要调用hashids的decode方法就可以获取到原始的整数id,然后用这个作为参数查询数据库获取到真实url
直接贴代码
代码语言:txt复制# -*- coding: utf8 -*-
from os import getenv
from hashids import Hashids
import json
from serverless_db_sdk import database
def main_handler(event, context):
# 读取请求参数
if "requestContext" not in event.keys():
return {"errorCode": 410, "errorMsg": "event is not come from api gateway"}
request = event["requestContext"]
# 云函数的API调用中的path参数是这么读取的
hash = event['pathParameters']['hash']
hashid = Hashids(salt="bangbangbang")
# decode得到id
auto_id = hashid.decode(hash)[0]
print(auto_id, hash)
# 用id从数据中查询url
result_data = []
sql_template = """SELECT url FROM bing.short_url where id = %s """
connection = database("BING").connection(autocommit=False)
try:
cursor = connection.cursor()
cursor.execute(sql_template, (auto_id))
result = cursor.fetchone()
url = result[0]
finally:
connection.close()
#因为要返回302消息,需要按照腾讯云的定义的集成响应的格式来返回
return {
"isBase64Encoded": False,
"statusCode": 302,
"headers": {"Location": url}
}
重点解释
path路径参数读取
我们一般生成短网址后使用的方式是这样的:
代码语言:javascript复制http://域名/{短链接字符串}
比如这样一个短链接:
代码语言:javascript复制http://short.url/zv
zv就是我们生成的短字符串,在腾讯云中要能够使用这种类型的api请求,需要在API网关控制台中对响应的api做如下配置:
然后在云函数中通过如下方式读取参数:
代码语言:txt复制# 这里的hash是前面配置的参数名
hash = event['pathParameters']['hash']
集成响应和透传响应
简单来说透传响应只会返回200状态码,将返回的内容作为消息体透传给前端,所以一般的返回json数据的函数调用可以直接使用此方式。
集成响应则可以自行定义返回的http状态码,消息头等等内容,我们这里是一个短网址的跳转,需要返回302或者301消息,所以必须使用集成响应的方式。
具体可以参见腾讯云官方文档的解释:
集成响应,是指 API 网关会将云函数的返回内容进行解析,并根据解析内容构造 HTTP 响应。
通过使用集成响应,可以通过代码自主控制响应的状态码、headers、body内容,可以实现自定义格式的内容响应,例如响应 XML、HTML、JSON 甚至 JS 内容。
在使用集成响应时,需要按照 API 网关触发器的集成响应返回数据结构,才可以被 API 网关成功解析,否则会出现 {"errno":403,"error":"Invalid scf response format. please check your scf response format."} 错误信息。
透传响应,是指 API 网关将云函数的返回内容直接传递给API请求方。
通常这种响应的数据格式直接确定为JSON格式,状态码根据函数执行的状态定义,函数执行成功即为 200 状态码。
通过透传响应,用户可以自行获取到JSON格式后在调用位置解析结构,获取结构内的内容。
样例
https://service-jmhm1hno-1256668370.gz.apigw.tencentcs.com/test/go/zv
绑定上自己的域名之后,就可以实现一个自己的短链接跳转服务了