本教程将使用FastAPI和Python构建一个URL缩短服务。该服务将提供三个API端点,用于创建缩短的URL,重定向到原始URL以及获取缩短URL的访问次数。

需求

  1. 应用程序应允许用户使用包含长URL的键值对的JSON正文向终端节点提交长URL。
  2. 收到请求后,服务器生成一个最多五个字符的随机字符串,并使用此字符串作为密钥以创建格式的缩短URL: http://company.com/<key>。 然后,应用程序应在响应正文中返回此缩短的URL,状态代码为201,并返回缩短URL的JSON对象。
  3. 应用程序应实现重定向功能,在用户访问缩短的URL时,将用户重定向到原始URL。如果缩短的URL不存在,返回404状态码。
  4. 应用程序应具有一个端点,该端点返回对响应正文中特定缩短URL的访问次数,其中包含访问次数的JSON对象。如果缩短的URL不存在,则应返回0次访问: /info/<key>
  5. 创建新的短URL应该时幂等的:即: 如果多次提交相同长的URL,则应返回相同的短URL。
  6. 应用程序应拒绝无效的URL。

示例

创建新的短网址:

  • 请求:
POST /
{“login_url': “http://a.very.long.long.url/even-loging-path”}
  • 响应:
{'show_url': 'http://company.com/abcdef'}

访问短网址:

  • 请求:
GET /abcdef
  • 响应: 重定向到: http://a.very.long.long.url/even-loging-path

获取访问次数

  • 请求
GET /info/abcdef
  • 响应:
{'visits': 1}

代码

import random
import string
import uvicorn
from fastapi import FastAPI, HTTPException

app = FastAPI()

url_mapping = {}  # 用于存储长URL和短URL的字典


def generate_random_key():
    '''生成随机的5个字符作为短URL的一部分'''
    return ''.join(random.choices(string.ascii_lowercase + string.digits, k=5))


@app.post('/')
def post(url_data: dict):
    long_url = url_data.get('login_url')
    if not long_url:
        raise HTTPException(status_code=400, detail='Invalid URL')

    if long_url in url_mapping.values():
        short_url = next(key for key, value in url_mapping.items() if value == long_url)
    else:
        characters = generate_random_key()
        short_url = ''.join(random.choice(characters) for _ in range(5))
        url_mapping[short_url] = long_url

    return {'short_url': f'http://company.com/{short_url}'}


@app.get('/{key}')
def get_key(key: str):
    if key not in url_mapping:
        raise HTTPException(status_code=404, detail='Short URL not found')

    return {'redirect_url': url_mapping[key]}


@app.get('/info/{key}')
def get_info(key: str):
    visits = 0
    if key in url_mapping:
        visits = 1

    return {'visits': visits}


if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)

运行程序

  1. 确保已安装FastAPI和uvicorn。
  2. 运行以下命令启动应用程序:
python main.py

现在,您可以使用以下URL访问API端点:

  • 创建新的短URL: http://localhost:8000/
  • 重定向到原始URL: http://localhost:8000/<key>
  • 获取访问次数: http://localhost:8000/info/<key>

注意

此示例代码仅供演示用途,实际使用时可能需要进行进一步的优化和扩展,例如:

  • 添加数据库以存储URL映射关系,以提高可靠性和可扩展性。
  • 使用更复杂的随机字符串生成算法,确保生成的短URL更具随机性。
  • 添加用户身份验证和授权机制,以控制对API的访问。
  • 使用缓存机制,提高响应速度。
使用FastAPI和Python构建URL缩短服务

原文地址: https://www.cveoy.top/t/topic/qp5z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录