Flask搭建api服务-生成API文档(Taobao/jd/1688API 调用文档说明)

news2025/1/18 10:04:12

API是给别人用的,就要告诉别人如何发现api,以及api的用途、名称、出参、入参,生成api文档的做法有好多种,本文选了一种最简单的方式。

核心就是通过app.view_functions 这个字典找到每个API 的endpoint所绑定的方法,然后访问方法的名字和文档即可

这里先列举1688平台API的一个文档说明再教大家如何构建API文档!

1688 API 接入说明

  1. API地址:申请KEY调用地址

  2. 调用示例:

    <?php
    
    // 请求示例 url 默认请求参数已经URL编码处理
    // 本示例代码未加密secret参数明文传输,若要加密请参考:https://open.onebound.cn/help/demo/sdk/demo-sign.php
    $method = "GET";
    $url = "https://api-gw.onebound.cn/1688/item_get/?key=<您自己的apiKey>&secret=<您自己的apiSecret>&num_iid=610947572360";
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($curl, CURLOPT_FAILONERROR, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_ENCODING, "gzip");
    var_dump(curl_exec($curl));
    ?>

  3. 参数说明

    • 通用参数说明

      • version:API版本
      • key:调用key,测试key:test_api_key
      • api_name:API类型[item_get,item_search]
      • cache:[yes,no]默认yes,将调用缓存的数据,速度比较快
      • result_type:[json,xml,serialize,var_export]返回数据格式,默认为json
      • lang:[cn,en,ru] 翻译语言,默认cn简体中文
    • API:item_get 参数说明: num_iid:宝贝ID

  4. 此API目前支持以下基本接口:

    • item_get 获得1688商品详情
    • item_search 按关键字搜索商品
    • item_search_img 按图搜索1688商品(拍立淘)
    • item_search_suggest 获得搜索词推荐
    • item_fee 获得商品快递费用
    • seller_info 获得店铺详情
    • item_search_shop 获得店铺的所有商品
    • item_password 获得淘口令真实url
    • upload_img 上传图片到1688
    • item_search_seller 搜索店铺列表
    • img2text 图片识别商品接口
    • item_get_app 获取1688app上原数据
    • buyer_order_list 获取购买到的商品订单列表
    • cat_get 获得1688商品分类

Flask搭建api服务-生成API文档 

从路由中搜索api,在这里可以构筑规则

def get_api_map():
    """Search API from rules, if match the pattern then we said it is API."""
    for rule in app.url_map.iter_rules():
        if 'docs' not in str(rule) and 'static' not in str(rule):
            yield str(rule), rule.endpoint

建立两个路由,一个是api docs的首页,一个是各个api的规则定义

@app.route('/', methods=['GET'])
def index():
    """List all API to this page, api_map contains each api url + endpoint."""
    api_map = sorted(list(get_api_map()))
    index_url = url_for('index', _external=True)
    api_map = [(index_url + x[0][1:], x[1]) for x in api_map]
    return render_template('api_index.html', api_map=api_map)
@app.route('/docs/<endpoint>', methods=['GET'])def docs(endpoint):
    """Document page for an endpoint."""
    api = {
        'endpoint': endpoint,
        'methods': [],
        'doc': '',
        'url': '',
        'name': ''
    }

    try:
        func = app.view_functions[endpoint]

        api['name'] = _get_api_name(func)
        api['doc'] = _get_api_doc(func)

        for rule in app.url_map.iter_rules():
            if rule.endpoint == endpoint:
                api['methods'] = ','.join(rule.methods)
                api['url'] = str(rule)

    except:
        api['doc'] = 'Invalid api endpoint: "{}"!'.format(endpoint)

    return render_template('api_docs.html', api=api)

获取api的名称和api文档内容

def _get_api_name(func):
    """e.g. Convert 'do_work' to 'Do Work'"""
    words = func.__name__.split('_')
    words = [w.capitalize() for w in words]
    return ' '.join(words)


def _get_api_doc(func):
    if func.__doc__:
        return func.__doc__
    else:
        return 'No doc found for this API!'

在原有的api函数内,补充晚上像个接口定义,包括入参、出参、名称、描述等等

@app.route('/getdimdict', methods=['GET', 'POST'])
def getdimdict():
    """
    接口名称:        /getdimdict 获取指标库的维度字典
    接口描述:
        获取指标库的维度字典,
    接口入参:        get方法
        参数无
    接口出参:        json格式        data = {
                  "code":"200",
                  “info":"处理成功"
                  "result":{
                    "typecode": "datelevel\",
                    "typename": "\u65e5\\u671f\\u5c42\\u7ea7\",
                    "dimcode": "01",
                    "dimname": "\\u5e74\"
                  }
                }
    """
    params = {}
    retinfo = {}
    errorflag = False
    retinfo['code'] = 200
    retinfo['info'] = '处理成功'
    retinfo['result'] = ''
    sqltext = config[DBSECTION]['getdimdict']
    jsonstr = getsqlresultjson(db, sqltext, params)
    retinfo['result'] = jsonstr
    response = jsonify(retinfo)
    response.status_code = 200
    return response

定义html的base页面-layout.html

{% extends "bootstrap/base.html" %}
{% block title %}Home{% endblock %}

{% block styles %}
    {{ super() }}
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
{% endblock %}


{% block content %}
    <div id="wrap">
    <!-- Begin nav bar -->
        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="container">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="#">API DOC DEMO</a>
                </div>
                <div class="collapse navbar-collapse">
                    <ul class="nav navbar-nav">
                        <li class="active"><a href="/">Home</a></li>
                    </ul>
                </div>
            </div>
        </div>
        <!-- Begin page content -->
        <div class="container">
            <ul class="breadcrumb">
                <li><a href="/">Home</a></li>
                {% block breadcrumb_nav %}{% endblock %}
            </ul>
            <div class="page-header">
                {% block page_header %}{% endblock %}
            </div>
        {% block content_area %}{% endblock %}
        </div>
    </div>
    <div id="footer">
        <div class="container">
            <p class="text-muted credit">Copyright © <a href="https://github.com/tobyqin/">Toby Qin</a>
                - <a href="https://github.com/tobyqin/flask_api_doc">Source at Github</a></p>
        </div>
    </div>
{% endblock %}

api_index.html

{% extends "./layout.html" %}
{% block title %}API Root{% endblock %}

{% block breadcrumb_nav %}
    <li><a href="{{ url_for('index') }}">Api Root</a></li>
{% endblock %}

{% block page_header %}
    <h1>Api Root</h1>
{% endblock %}

{% block content_area %}
<pre>{
{% for i in api_map %}    "<a href="/docs/{{ i[1] }}">{{ i[0] }}</a>"{{ ",\n" if not loop.last }}{% endfor %}
}</pre>
{% endblock %}

api_docs.html

{% extends "./layout.html" %}
{% block title %}API - {{ api['name'] }}{% endblock %}

{% block breadcrumb_nav %}
    <li><a href="{{ url_for('index') }}">Api Root</a></li>
    <li><a href="{{ api['url'] }}">{{ api['name'] }}</a></li>
{% endblock %}

{% block page_header %}
    <h1>{{ api['name'] | upper }}</h1>
{% endblock %}

{% block content_area %}
<pre>
<b>Target:</b><span><a href="{{ api['url'] }}">{{ api['url'] }}</a></span>
<b>Allow :</b> <span>{{ api['methods'] }}</span>
<b>Usage :</b> <span>{{ api['doc'] }}</span>
</pre>
{% endblock %}

api首页的页面如下:

 

具体api的像个文档

 

最后,谢谢关注,谢谢支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter的环境搭建步骤(MacBook Pro)

1.下载Flutter SDK包 地址&#xff1a;https://docs.flutter.dev/get-started/install/macos 2.配置环境变量 vim ~/.bash_profile //在打开的文件里增加一行代码&#xff0c;意思是配置flutter命令在任何地方都可以使用。 export PATH/app/flutter/bin:$PATH // 从新加载 sou…

JS 实现区块链同步和共识

JS 实现区块链同步和共识 之前实现了区块链和去中心化网络&#xff0c;这里实现区块链的同步和共识&#xff0c;不过本质上来说使用的的方法和 register & broadcast 的方法是一样的。 这个也是目前学习中倒数第二篇笔记了&#xff0c;最后两个部分学完&#xff0c;block…

机器视觉之线缆字符检测

在生活当中&#xff0c;随处可见与印刷字符有关的产品&#xff0c;比如&#xff1a;线缆上字符&#xff0c;键盘上的字符&#xff0c;衣物上的标签字符&#xff0c;电器上的字符等等。 而这些产品的外观由于字符在印刷时产生的一些瑕疵&#xff0c;如字符拉丝、移位、多墨、缺失…

身为管理层总是被下属怼,自己毫无威严,如何改变这样的现状?

身为一名管理层&#xff0c;被下属怼的感觉无疑是相当不爽的。毕竟&#xff0c;作为领导者&#xff0c;我们希望能够得到下属的尊重和信任&#xff0c;而不是被他们视为“摆设”。如果你也有类似的经历&#xff0c;那么不妨试试以下几种方法&#xff0c;来改变这种局面。 首先…

C++ Qt5.9学习笔记-事件1.5W字总结

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

物业管理系统【纯控制台】(Java课设)

系统类型 纯控制台类型&#xff08;没有用到数据库&#xff09; 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Idea或eclipse 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87753361 更多系统…

YOLOv5结合BiFPN:BiFPN网络结构调整,BiFPN训练模型训练技巧

目录 一、BiFPN网络结构调整1、堆叠BiFPN2、调整网络深度3、调整BiFPN的参数 二、训练技巧和注意事项1、数据增强2、学习率调度3、优化器选择4、权重初始化5、模型选择6、Batch size的选择7、模型保存和加载8、注意过拟合和欠拟合问题 三、实验结果和分析1、数据集和评估指标2、…

开发、部署应用程序APP的【12要素原则】你顺便了解一下?

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 开发、部署应用程序APP的【12要素原则】你顺便了解一下&#xff1f; ☘️摘要☘️介绍☘️背景☘️谁应该阅读这份文件?☘️十二要素原则&#x1f33f;I. 代码库 Codebase&#x1f…

2.进程与线程

2.进程与线程 2.1 进程与线程 进程&#xff1a; 程序由指令和数据组成&#xff0c;指令要执行&#xff0c;数据要读写&#xff0c;就需要将指令加载到cpu&#xff0c;数据加载到内存&#xff0c;进程就是用来加载指令、管理IO、管理内存的当一个程序被执行&#xff0c;从磁盘…

大数据环境准备(二) - VMware 虚拟机系统设置

VMware 虚拟机系统设置 1.对三台虚拟机完成主机名、固定IP、SSH免密登录等系统设置 1&#xff09;配置固定IP地址 开启node1,修改主机名为node1 #切换root用户 su - #修改主机名 hostnamectl set-hostname node1关闭node1终端&#xff0c;重新打开&#xff1b; 同理开启nod…

Java页面布局

Java页面常用的布局主要有五种&#xff1a;FlowLayout、BorderLayout、GridLayout、CardLayout和NULL 1、FlowLayout 称为“流布局”&#xff0c;将组件按从左到右顺序、流动的安排到容器中&#xff0c;直到占满上方的空间时、则向下移动一行&#xff0c;Flow Layout是面板的…

13.多线程

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 1.2并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上…

Packet Tracer - 配置 IPv6 ACL

Packet Tracer - 配置 IPv6 ACL 拓扑图 地址分配表 设备 接口 IPv6 地址/前缀 默认网关 服务器 3 NIC 2001:DB8:1:30::30/64 FE80::30 目标 第 1 部分&#xff1a;配置、应用并验证一个 IPv6 ACL 第 2 部分&#xff1a;配置、应用并验证第二个 IPv6 ACL 第 1 部分…

node.js+vue鲜花销售网站

后台模块设计&#xff1a; ①用户管理功能。管理员在后台首页点击用户管理就会进入用户列表页面&#xff0c;系统会将数据库中的用户信息以列表的形式显示出来&#xff0c;管理员可以在这个页面进行用户的更新和删除操作&#xff0c;系统可以将最新更新的信息重新写入用户表中并…

Chrome浏览器更新字体看不清的最终解决方案

阿酷TONY / 2023-5-6 / 长沙 / 原创 / 实测解决 Chrome更新至版本Chrome 109.0.5414.120 字体看不清 浏览器症状&#xff1a;Chrome更新至版本Chrome 109.0.5414.120 字体看不清&#xff1b;会很细&#xff0c;在设置中选择自定义的字体&#xff0c;仍无法解决&#xff1b;…

当因果推理遇上时间序列,会碰撞出怎样的火花?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 近年来因果推理和时间序列已经成为了数据科学领域备受瞩目的研究方向。因果推理可以帮助我们识别变量之间的因果关系&#xff0c;时间序列分析则可以便于我们理解变量随时间变化的规律。这两个方向都可以为我们…

javaScript---设计模式-封装与对象

目录 1、封装对象时的设计模式 2、基本结构与应用示例 2.1 工厂模式 2.2 建造者模式 2.3 单例模式 封装的目的&#xff1a;①定义变量不会污染外部&#xff1b;②能作为一个模块调用&#xff1b;③遵循开闭原则。 好的封装&#xff08;不可见、留接口&#xff09;&#xff1a;①…

Cacti 前台命令注入漏洞

文章目录 文档说明漏洞描述影响版本漏洞原理命令执行简单分析客户端ip伪造分析 漏洞复现下载vulhub启动环境配置攻击 复现总结修复方案原创申明 文档说明 本文作者:SwBack 创作时间:2023/4/8 0:12 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/q…

solidity--语言基础

solidity源文件结构 // SPDX-License-Identifier: MIT pragma solidity ^0.5.2; pragma abicoder v1; import "filename"; 注释 智能合约组成 状态变量 // SPDX-License-Identifier: GPL-3.0 pragma solidity >0.4.0 <0.9.0;contract SimpleStorage {uint stor…

SD卡打不开是怎么回事?SD卡打不开里面数据怎样恢复

SD卡已经成为了移动设备和数码相机中受欢迎的存储选项之一。但是使用过程中难免会遇到一些问题&#xff0c;例如SD卡突然打不开了&#xff0c;并且无法访问其中的数据。这种情况常常让人感到烦恼和无助。但是不要紧张&#xff0c;下面我们将介绍SD卡打不开里面数据怎样恢复的方…