前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Serverless-实现一个短网址服务(二)

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

原创
作者头像
Thor
修改2020-06-15 10:39:14
1.4K0
修改2020-06-15 10:39:14
举报
文章被收录于专栏:云上服务云上服务

要点

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

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

从请求的短链接获取真实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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 要点
  • 从请求的短链接获取真实url
  • 直接贴代码
  • 重点解释
    • path路径参数读取
      • 集成响应和透传响应
      • 样例
      相关产品与服务
      云函数
      云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档