Serverless-实现一个短网址服务(二)

2,315 阅读3分钟

要点

上一篇 Serverless-实现一个短网址服务(一)实现了一个生成短链接的云函数,这一篇完成后半部分,实现短链接的跳转。主要需要注意的内容有:

  1. 腾讯云函数的API调用中如何读取path中的参数
  2. 腾讯云函数中的集成响应和透传响应的区别

从请求的短链接获取真实url

如前文所属,我们生成的短链接是使用hashids库从整数id生成的,所以获取真实url的过程也非常简单,只需要调用hashids的decode方法就可以获取到原始的整数id,然后用这个作为参数查询数据库获取到真实url

直接贴代码

# -*- 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路径参数读取

我们一般生成短网址后使用的方式是这样的:

http://域名/{短链接字符串}

比如这样一个短链接:

short.url/zv

zv就是我们生成的短字符串,在腾讯云中要能够使用这种类型的api请求,需要在API网关控制台中对响应的api做如下配置:

然后在云函数中通过如下方式读取参数:

# 这里的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格式后在调用位置解析结构,获取结构内的内容。

样例

service-jmhm1hno-1256668370.gz.apigw.tencentcs.com/test/go/zv

绑定上自己的域名之后,就可以实现一个自己的短链接跳转服务了