5分钟构建API接口服务 | python小知识

简介: Flask是python中轻量的web框架,Flask的两个核心模块除了模板渲染之外就是请求响应处理,其中请求响应处理是由 Werkzeug(WSGI 工具库)完成,而模板渲染是由Jinja(模板渲染库)完成。Flask因为轻量灵活,用来构建API接口十分合适

5分钟构建API接口服务 | python小知识

1. 什么是API

我们经常会使用一些API接口来完成特定的功能,比如查询天气的数据,下载股票的数据,亦或是调用ChatGPT模型的结构等等。

API全称是Application Programming Interface,即应用程序接口,它通常提供了一个功能函数,而这个功能函数的输入和输出是和调用方相互约定的。

从架构上来讲,API通常从客户端和服务端模型;客户端以数据形式向服务器发送请求,服务器使用该客户端输入来开始执行内部函数,并将输出数据返回到客户端。

所以我们要开发一个API接口,从设计上就需要明确:

  • 你要提供什么样的功能
  • 功能的输入是什么
  • 功能的输出返回是什么

从技术上,要提供一个服务来接收请求和返回结果,通常是一个满足HTTP协议的HTTP接口,也可以是RPC接口。我们这里要讲的是HTTP接口

这也是API的本质。

2. 用Flask构建API

要实现一个API,我们要构建一个HTTP服务。HTTP(超文本传输协议)是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范,是一个典型的请求/响应模式的协议。

Flask是python中轻量的web框架,Flask的两个核心模块除了模板渲染之外就是请求响应处理,其中请求响应处理是由 Werkzeug(WSGI 工具库)完成,而模板渲染是由Jinja(模板渲染库)完成。

Flask因为轻量灵活,用来构建API接口十分合适。

2.1 Flask入门

安装Flask

pip install flask

我们看一个简单的例子:

from flask import Flask

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'hello world'

if __name__ == '__main__':
    app.run("0.0.0.0", debug=True, port=6006)

调用(假设上面的文件为hello.py):

python hello.py

yyq-2023-03-20-23-16-58.png

此时,你调用http://127.0.0.1:6006/hello就会返回hello world

上面是最简单的一个接口了,从上面我们可知Flask的工作机制:

  • Flask(__name__)申明了一个服务app
  • app.run来启动这个服务,包括服务的地址ip和端口
  • @app.route装饰器定义了接口访问的URL地址和方法(GET/POST)
  • hello的函数就是具体接收请求响应的函数功能模块,由@app.route装饰

2.2 实用的FlaskAPI

上面的例子显然是不能满足一个完整的API的功能,首先我们要接收请求的数据,Flask是通过request来接收请求数据,HTTP请求通常由两个方式GET和POST。

from flask import Flask
from flask import request
import json
import traceback

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'hello world'

@app.route('/v1/task', methods=['GET', 'POST'])
def do_task():
    try:
        print(request.method)
        if request.method == "GET":
            content = request.args.get("content")
            # comment = request.values.get("content")
            res = int(content) + 10
            print(res, type(content))

        elif request.method == "POST":
            print("========", request.headers)
            content_type = request.headers.get('Content-Type')
            if "multipart/form-data" in content_type:
                form_data = dict(request.form)
                # files_data = dict(request.files)
                # print(form_data)

                res = int(form_data.get('content')) + 14
                
            elif "application/json" in content_type:
                # request.get_data() # 原始的数据
                input_dict = request.get_json()
                res = input_dict.get('content') + 12

            elif "application/x-www-form-urlencoded" in content_type:
                input_dict = request.form
                # request.values.get("content")
            else:
                print(request.get_data())

        print('url: %s , script_root: %s , path: %s , base_url: %s , url_root : %s' % (
            request.url, request.script_root, request.path, request.base_url, request.url_root))
            
        return json.dumps({"code": 0, "msg":"success", "data": res})
    except:
        err_msg = 'url: %s, err_msg: %s' % (request.url, (str(traceback.format_exc())))
        print(err_msg)
        return json.dumps({"code": -1, "msg":"failed", "data": 0})
    

if __name__ == '__main__':
    app.run("0.0.0.0", debug=True, port=6006)

以GET方式请求

http://127.0.0.1:6006/v1/task?content=3
# {"code": 0, "msg": "success", "data": 13}
# 127.0.0.1 - - [20/Mar/2023 23:53:28] "GET /v1/task?content=3 HTTP/1.1" 200 -

以POST方式请求

POST是通过表单form的方式来传递数据,数据可以使用不同的Content-Type来发送。比如:

  • application/json 的方式 ,请求body体的内容就是{"a": "b", "c": "d"}
  • application/x-www-form-urlencoded 的方式,则body体的内容就是 a=b&c=d
  • multipart/form-data 通常是要上传文件

POST请求调用如下:

import requests
import json
url = 'http://127.0.0.1:6006/v1/task'
headers = {'content-type': "application/json", 'Authorization': 'APP appid = 4abf1a,token = 9480295ab2e2eddb8'}
s = json.dumps({'content': 1, 'key2': 'value2'})
r = requests.post(url, data=s, headers=headers)
print(r.text)


url = 'http://127.0.0.1:6006/v1/task'
files = {'file': open('lena.jpg', 'rb')}
s = {'content': 1, 'key2': 'value2'}
r = requests.post(url, files=files, data=s)
print(r.text)

除此之外,从上面的例子可知:

  • GET方式是通过request.args获取数据
  • POST方式是通过request.get_json() request.get_data() request.form获取数据
  • request.method获取请求方式
  • request.headers获取HTTP头信息

3. 总结

今天分享了用Flask构建API接口,总结如下:

  • API的本质是客户端访问服务端的函数,访问的方式是一个HTTP请求(HTTP接口)
  • HTTP请求有GET和POST
  • Flask用request接收客户端请求
  • POST请求有不同的类型,json或者x-www-form-urlencoded或者multipart/form-data,不同的方式有不同的接收方式
  • API接口返回通常以json形式返回
目录
相关文章
|
9天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
23天前
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
39 12
|
17天前
|
存储 API 数据库
使用Python开发获取商品销量详情API接口
本文介绍了使用Python开发获取商品销量详情的API接口方法,涵盖API接口概述、技术选型(Flask与FastAPI)、环境准备、API接口创建及调用淘宝开放平台API等内容。通过示例代码,详细说明了如何构建和调用API,以及开发过程中需要注意的事项,如数据库连接、API权限、错误处理、安全性和性能优化等。
69 5
|
23天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
45 11
|
21天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
21天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
54 3
|
24天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
112 5
|
24天前
|
API Python
利用python淘宝/天猫获得淘宝app商品详情原数据 API
要使用Python获取淘宝/天猫商品详情原数据,需先注册开放平台账号并实名认证,创建应用获取API权限。随后,根据API文档构建请求URL和参数,使用requests库发送请求,处理返回的商品详情数据。注意遵守平台使用规则。
|
27天前
|
JSON 缓存 测试技术
构建高效RESTful API的后端实践指南####
本文将深入探讨如何设计并实现一个高效、可扩展且易于维护的RESTful API。不同于传统的摘要概述,本节将直接以行动指南的形式,列出构建RESTful API时必须遵循的核心原则与最佳实践,旨在为开发者提供一套直接可行的实施框架,快速提升API设计与开发能力。 ####
|
27天前
|
供应链 API 开发者
探索Python与1688商品详情API接口的协同效应
在数字化时代,1688作为中国领先的B2B平台,其商品详情API接口为市场分析、库存管理和销售策略提供了重要数据支持。本文介绍如何使用Python调用该API,包括前期准备、技术实现、数据解析及错误处理等内容,助力企业和开发者挖掘数据价值,提升商业智能水平。