[python]从零开始的API调用教程
一、API是什么?
API即应用程序编程接口,是一组定义了不同软件系统或组件之间如何交互的规则和协议。API为开发者提供了一种简化的方式,通过预定义的函数或方法,来使用某个软件、库、操作系统或硬件的功能,而不需要深入了解其内部工作原理。
API 的类型
-
Web API:也叫做网络API或HTTP API,允许应用程序通过网络(通常是互联网)进行交互。Web API通常使用HTTP协议,传递JSON或XML格式的数据。例如,天气预报应用可以通过调用一个天气服务的Web API,获取当前的天气信息。
-
操作系统API:操作系统提供的API允许开发者访问硬件资源或系统服务。例如,Windows API允许程序访问文件系统、网络连接、显示图形等操作系统功能。
-
库或框架的API:编程语言中的库或框架通常提供API,允许开发者调用其功能。例如,Python的
requests
库提供了简单的API来发起HTTP请求。 -
硬件API:一些硬件设备(如显卡、传感器等)也提供API,供开发者控制或与设备通信。例如,图形API(如OpenGL、DirectX)用于开发3D图形应用。
这里我们主要讲解web API,教大家怎么使用网络的方式调用一些远程的API从而简化我们的程序。
二、为什么我们需要web API?
在如今庞大的互联网环境中,各个服务节点之间的交互是非常复杂的,每个服务器上都运行着不同的服务以供用户使用。当我们在开发一款应用时,我们可能需要为我们的应用添加一个天气查询功能,我们肯定不能自己在各地都成立气象站实时监测天气,当然这也不现实,首先是成本高昂,可实现性低,其次就是数据量庞大,处理这些数据的成本也高。那怎么办呢?当然是使用API来解决问题,我们自己不能做的事总会有别人做,别人将各地的天气数据收集好然后开放出相应的接口我们直接使用别人开放出来的接口即可。这样我们也不用在意这一切的实现,毕竟我们只需要调用接口就能知道某地的天气信息。当然,相对的,对方为我们提供了API的服务,其自身的成本也非常高昂,我们在调用某些API时,可能需要支付给API服务商一些费用。上面只是从用户出发的一个场景。下面我们从商户出发。假如,我作为一个商户,我开发了一款大模型。因为商业竞争原因,我不能将我的大模型直接开源,那我也想让我的用户使用,那应该怎么办呢?当然还是使用API,我不一定需要开源我的模型,我可以就我模型而言,开放相应的API给我的用户使用。这样我的用户只需要调用我的API就可以直接使用我的模型了。用户也可以就我模型的API开发新的应用,将我的服务嵌入到自己的软件中。当然,上面只是API一些常见的调用方式,API的使用场景还有很多,比如一些博客中的随机图片,每日一言,大多都是用API实现的。可以说API已经存在于我们生活中的方方面面。
三、需要准备什么?
这篇API的调用教程已经不只针对于纯新手了,在学习之前需要大家具备一定的python基础,能够看懂最基本的代码,以及知道怎么使用pip安装python库。
四、如何调用一个大语言模型的API
这篇文章是为了教会大家如何调用web API,这里我们主要使用百度千帆大模型进行演示。当大家会调用这个API以后,根据自己举一反三,后续许多API大家都能自行进行调用了。如果你准备好了,那就让我们开始吧!
这里我们直接在浏览器中搜索“百度开放平台”:
如果你没有搜到,可以直接点下面的链接直接进入:
百度开放平台:百度AI开放平台-全球领先的人工智能服务平台 (baidu.com)
进来以后就可以看到以下的界面了:
下面我们点击“文心大模型”:
再点击“百度智能云千帆大模型平台”:
点击以后就来到了以下界面:
往下滑就能看到百度推出的最新的几款模型:
这里我们主要教大家如何调用接口,以及如何阅读接口文档,这里我们随便选择一款模型,点击
“API文档”:
这里我们只是作为演示,也是为了教会大家如何使用,所以我就随便选取了一个模型的API文档,这里我选择的是“ERNIE 4.0”的API作为演示:
因为我们这里教大家API调用,更注重调用时的细节,虽说百度已经封装好了相关的SDK,调用起来更方便,但是为了学习API调用的原理,我们这里还是选择“HTTP”调用:
这里简单的来说一下两者的区别,SDK是封装好的一个库,我们可以直接使用并且不需要在意调用时的细节。HTTP调用是最原始的API调用方法,API的提供者通过开放一个网络接口,我们使用指定请求方式向接口请求数据,并且接收API接口的返回值。现在,相信你对API和SDK都有一定的了解了,那就让我们来看看文档吧!
这里我们首先看到“HTTP调用”方法的“鉴权说明”:
这里的鉴权主要是用于验证用户身份,之前也提到过,我们有的API是收费的或者为了防止API被滥用,许多API都设立鉴权,用于验证用户身份或者计费。
因为我们这里使用“access_token”鉴权,我们可以这里的链接了解这种鉴权方式:
当我们点击了上面的链接以后,来到了一篇新的文章,这篇文章会教我们如何鉴权:
这里我们使用”access_token鉴权认证“,所以我们看文章的第一部分:
在文档中,这里一共有三个步骤,分别是“获取API key和Secret Key”,“通过调用接口获取access token”,“使用accesstoken”:
根据文档的步骤,这里我们先去获取“API key和Secret Key”,同样的,我们可以点击提供的文档:
这里的两个key获取的步骤比较简单,就不详细讲解了,大家自行创建好应用就可以看到key了:
然后我们就可以进行下一步了,这里我们需要使用接口获取“access_token”,我们同样进入它的相关文档:
下面我们看到请求说明:
这里我们就需要写代码了,大家打开自己熟悉的IDE,这里我使用的是pycharm,如果你想知道pycharm的安装方法,可以看下面的教程:
pycharm安装教程:[python]我们应该如何正确的安装和汉化pycharm,并且导入开发环境?_python汉化-CSDN博客
我们可以在pycharm中新建一个工程并且导入一个python环境,如果你还不会导入开发环境,可以参考上面的教程。
如下图,我们的pycharm环境已经创建好了并且已经导入了一个python环境:
首先,既然要请求API接口,我们需要一个python中的网络请求库,这里我们在python中最常用的网络请求库是“requests”库,我们使用下面的命令来安装“requests”库:
pip install requests
在安装好requests库以后,我们就可以开始写代码了。
这里我们继续回到获取access token的文档:
我们首先在python代码中引用我们安装好的requests库:
然后我们要在这个文件中指定python的函数入口点,因为后面我们会封装许多函数,所以这里要指定一个python的入口点,这里在入口点的下方随便写一个函数防止报错:
下面我们来封装我们的第一个函数,用来获取access token:
在文档中我们可以看到,这里获取access token使用的是POST的请求方式,我们可以直接使用函数“requsts.post”函数,我们可以看到,这个函数的显性参数有这些:
这里我们需要填写的有“url”,“headers”,“data”几个,即使这里的“headers”参数在“requsts.post”函数中被明确要求,但是在API文档中headres参数被要求了值,这里我们仍然要将其加入:
这里我们首先就可以来写headres,我们可以使用一个字典来存放headres:
headers={'Content-Type' : 'application/json','Accept': 'application/json'}
这里的'Content-Type' : 'application/json'表示向服务器提供的数据是JSON格式的,这是在文档中被要求的。'Accept': 'application/json'表示期待服务器的回复也是JSON,这个是用户定义的,如果服务器的返回值默认是JSON这个也可以不写。
然后我们来写url,这里我们直接使用一个变量来装url就行了,这里在文档中,我们看到Query参数:
这里的Query参数我们需要填写在url中,如图:
这里的url大家按照我的格式写即可,注意观察我的url中的参数和文档中提到的Query参数:
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=oQhJMMU2YLjkPE8jbnUl7dlg&client_secret=l0sWf63eSYXAdL6ZNGWHA5eSFIPNZhm2"
将函数写完以后,就可以将我们封装的函数写道main函数中测试一下,如果前面都写对了的话,就可以得到下面的结果了:
如果你在这一步中,执行了函数但是没有值返回,你可以考虑查看url中的Query参数有没有写错,反复核对一下文档,请求url和和Query参数之间有没有用?分隔。如果返回一个错误的JSON,可以根据错误内容和错误代码解决相关问题。下面我们来举一个例子,也是作为一个错误复现,假如我将我的key中的一个字符删除,就会出现以下错误:
这里的“unknown client id”翻译过来就是“未知的用户id”这就表示我们的key错了。每一种以JSON形式返回的错误都是有解决方法的,如果在这一段JSON中没有直接提示错误也会提示错误码,大家可以对照文档下面的错误码查询解决办法:
我们现在将程序调到正常的状态,我们可以看到返回JSON数据中有一个access_token的键:
我们可以提取JSON中的这个键:
在代码中加入下面的代码:
returnjson = returndata.json()access_token = returnjson.get("access_token")print(access_token)
简单解释一下,“returnjson = returndata.json()”用于对返回值创建一个JSON的对象。
“access_token = returnjson.get("access_token")”,为了将JSON对象中的“access_token”键提取出来并存放在“access_token”变量中。
“print(access_token)”,将我们的access_token打印出来。
这样我们就得到了下面的结果:
我们可以为这个函数写一个返回值,直接将我们的access token作为函数的返回值:
至此,我们已经获取到了access token,让我们回到鉴权的文章中,我们可以看到,这里是最后一步,怎么使用access token:
这里我们直接将access token按照一定格式加在我们的API接口后面即可。现在我们不着急拼接,我们写一个调用API的函数,因为我们这里是调用的语言模型,我们就可以将我们说的话作为函数的传入参数,将AI的回复作为函数的返回值:
我们先调用一开始封装好的获取access token的函数,将我们的access token存放在一个变量中:
下面我们按照文档中的鉴权要求拼接url:
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token="+access_token
这里的url如果你不确定有没有拼对,可以考虑将其打印出来:
打印出来得到以下结果:
这样就表示我们的url与accesstoken拼接成功了。注意,格式一定要一样,如果在这里出现问题,在后面肯定会调用失败,请反复检查是否使用?分隔,检查有没有加=号。
我们继续看API文档:
这里可以看到,我们这里的API请求方式仍然需要使用POST的方式,我们同样的将POST的请求函数写出来,再看看差什么,再考虑写什么?
这里我们url已经有了还差headers,和data。这里的headers我们直接复制上面个的就行:
最后我们来写data,这里我们再看文档:
这里的data我们要写成JSON格式的,里面要放一个键messages作为与AI的对话内容,也可以将AI的回复内容保存在其中让AI具有上下文能力,这里我们将文本转换为JSON并且存放在变量中,大家按照此格式写即可:
payload = json.dumps({"messages": [{"role": "user", "content": "你好"}]})
上面我们要的都凑齐了,我们下面来填写“requests.post”函数的参数,如下:
requests.post(url,headers=headers,data=payload)
我们同样的将其返回值打印出来:
大家可以看到,我们这里已经收到了AI的返回值了。
我们同样的,使用上面的代码将AI的回复提取出来:
returnjson = returndata.json()
baiduchat = returnjson.get("result")
print(baiduchat)
这里可以看到,AI的回复已经成功的被提取出来了:
我们这里将AI的回复内容作为函数的返回值,并且将传入的参数作为我们要对AI说的话放在messages中:
我们直接将这个函数的返回值打印出来:
可以看到,我们这里的回复已经打印出来了:
五、结语
在本次教程中,教了大家如何根据API的文档来调用API,自己阅读文档调用API也能更直观的感受一个API的调用过程。如果大家在调用API时遇到了我没有提到的问题,可以考虑多次阅读文档,或者使用文档中的请求示例。在使用请求示例时,直接将相关的key填入对应的位置即可。当然,本次教程是为了教会大家,如果遇到要调用API的场景,到底应该怎么办,怎么去准备需要的数据。这篇教程中我们首先为了鉴权去获取access token,然后又根据文档中的示例进行了鉴权。最后我们根据API文档中的参数,将我们对AI的对话填入messages中,最终完成的调用。不只是百度的API,有很多API的调用方式都与这个类似,在调用API时仔细阅读文档,观察哪些东西是必须的。最后,感谢大家观看!
相关文章:

[python]从零开始的API调用教程
一、API是什么? API即应用程序编程接口,是一组定义了不同软件系统或组件之间如何交互的规则和协议。API为开发者提供了一种简化的方式,通过预定义的函数或方法,来使用某个软件、库、操作系统或硬件的功能,而不需要深入…...
FFmpeg 怎样根据图片和文本生成视频
使用FFmpeg根据图片和文本生成视频,你可以使用image2过滤器来处理图片,并使用subtitles过滤器来添加文本。以下是一个基本的命令行示例,它将图片转换为视频,并将文本作为字幕叠加: ffmpeg -loop 1 -i image.jpg -vf &…...

paddlepaddle显存未正常释放
NVIDIA GPU 显存未正常释放 问题描述 paddlepaddle 训练过程出现问题中断等导致GPU显存没有释放。 情况1: 使用nvidia-smi -l查看显存占用情况,输出结果中没有显示PID,但是有显存占用。 解决方法 使用killall python 直接kill掉所有python进程。假如运行此命…...
websocket的使用
1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.配置websocket服务 Configuration public class WebSocketConfig {/*** 配置WebSocket服…...
docker如何建立本地私有仓库,并将docker镜像推到私有仓库
在 Docker 中,您可以通过 Docker Registry 创建本地私有仓库,并将 Docker 镜像推送到这个私有仓库。以下是具体步骤: 步骤 1:启动一个本地 Docker 私有仓库 拉取 registry 镜像: Docker 官方提供了一个 registry 镜像…...
vllm启动大语言模型时指定chat_template
问题介绍 在Linux下启动vllm: python3 -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --model /model/Baichuan2-7B-Chat --trust-remote-code --gpu-memory-utilization 0.80使用下面的命令测试出错: curl -X POST \http://127.0.0.1…...
网络相关(HTTP/TCP/UDP/IP)
网络相关 常见的状态码 100 临时响应 100 继续,请求者应当继续提出请求101 切换协议200 成功响应 200: 服务器成功处理请求201 以创建,请求成功并且服务器创建了新的资源202 已接受:服务器已接受请求,但尚未处理203 非授权信息:服务器已成功处理请求,但返回的信息可能来…...

TF卡长期不用会丢失数据吗?TF卡数据恢复容易吗?
在现代科技快速发展的时代,TF卡(TransFlash卡)作为便携式存储设备,广泛应用于手机、相机、无人机等多种电子设备中,成为我们日常存储照片、视频、文档等重要数据的得力助手。然而,关于TF卡长期不使用是否会…...

Flink状态一致性保证
前言 一个Flink作业由一系列算子构成,每个算子可以有多个并行实例,这些实例被称为 subTask,每个subTask运行在不同的进程或物理机上,以实现作业的并行处理。在这个复杂的分布式场景中,任何一个节点故障都有可能导致 F…...

前端一键复制解决方案分享
需求背景 用户需要对流水号进行复制使用,前端的展示是通过样式控制,超出省略号表示,鼠标悬浮展示完整流水号。此处的鼠标悬浮展示采用的是:title,这样就无法对文本进行选中。 下面是给出一键复制的不同的解决方案,希望…...
麒麟操作系统swap使用率过高的排查思路
现象:用户业务环境服务器在运行时,监控平台告警swap使用99%,在系统内查询物理内存使用39%左右,swap使用达99%。 问题排查: 1)使用命令查询使用了swap空间的进程并排序:for i in cd /proc;ls |gr…...
爬虫python=豆瓣Top250电影
主流程:获取数据,解析数据,保存数据 from bs4 import BeautifulSoup #网页解析获取数据 import re #正则表达式 import urllib.request,urllib.error #获取网页数据 import sqlite3 #轻量级数据库 import xlwt #进行excel操作 #影视详情…...

【Eclipse系列】解决Eclipse中xxx.properties文件中文乱码问题
问题描述:由于eclipse对Properties资源文件的编码的默认设置是ISO-8859-1,所以在打开.properties文件时,会发现中文乱码了,如图: 解决方法: 1、一次生效法 右击该properties文件–>properties–>Re…...

mysql主从复制及故障修复
一、主MySQL数据库的配置 分别在三台主机(chen2/10.110、chen3/10.120、chen4/10.130)中安装mysql数据,其中chen2/10.110作为主MySQL服务器,其余两台作为从MySQL服务器。 1、在主机上部署mysql数据库 详细的请看上一篇:mysql数据…...

基于springboot的网上服装购物商城系统
基于springboot的网上服装购物商城系统 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取: &#x…...

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理
aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理 学习内容: AWS的虚拟私有,共有子网以及ACL定义公网碉堡主机子网,私有子网和共有子网以及varnish反向代理 1. AWS的虚拟…...

接口测试(三)jmeter——连接mysql数据库
一、jmeter安装jdbc 1. 下载插件包,mysql数据库为例,驱动 com.mysql.jdbc.Driver 需要下载 mysql-connector-java-5.1.7-bin.jar 插件包,将插件包放到 jmeter 安装目录下的 lib 目录 2. 给jmeter安装jdbc驱动 二、jmeter操作数据库 1.…...

双十一购物节有哪些好物值得入手?2024双十一好物清单合集分享
一年一度的双十一购物狂欢节即将来临,各大平台纷纷开启预热活动,伴随着品牌的疯狂折扣和满减优惠,众多商品即将迎来超值的价格。现在正是大家“剁手”换新装备的大好时机。作为一名深耕智能产品多年的资深达人,今天这期我将从不同…...

jmeter中请求参数:Parameters、Body Data的区别
使用jmeter发送请求,常常要伴随传递参数。有两种请求参数: Parameters, Body Data, 它们的使用方式有很大不同。 先看下get和post请求的区别。 get请求:顾名思义是从服务器获取资源。 post请求:顾名思义是往服务器提交要处理的数据。 直观…...

Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例
拉取镜像 docker pull docker.io/webcenter/activemq 启动容器 docker run -d --name myactivemq -p 61616:61616 -p 8162:8161 docker.io/webcenter/activemq:latest 这样就代表启动成功了 浏览器访问 http://localhost:8162/ admin admin 开启验证 修改配置文件/opt/ac…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...