您现在的位置是:首页» windows系统» python新手如何调用api接口,怎么写python程序的api接口

python新手如何调用api接口,怎么写python程序的api接口

2023-12-05 02:55:51
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家! 使用 Python和 Flask设计 RESTful API近些年来 REST(REpresentational State Transfer)已经变成了 web services和

今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!

使用 Python和 Flask设计 RESTful API

近些年来 REST(REpresentational State Transfer)已经变成了 web services和 web APIs的标配。

在本文中我将向你展示如何简单地使用 Python和 Flask框架来创建一个 RESTful的 web service。

六条设计规范定义了一个 REST系统的特点:

客户端-服务器:客户端和服务器之间隔离,服务器提供服务,客户端进行消费。

无状态:从客户端到服务器的每个请求都必须包含理解请求所必需的信息。换句话说,服务器不会存储客户端上一次请求的信息用来给下一次使用。

可缓存:服务器必须明示客户端请求能否缓存。

分层系统:客户端和服务器之间的通信应该以一种标准的方式,就是中间层代替服务器做出响应的时候,客户端不需要做任何变动。

统一的接口:服务器和客户端的通信方法必须是统一的。

按需编码:服务器可以提供可执行代码或脚本,为客户端在它们的环境中执行。这个约束是唯一一个是可选的。

什么是一个 RESTful的 web service?

REST架构的最初目的是适应万维网的 HTTP协议。

RESTful web services概念的核心就是“资源”。资源可以用URI来表示。客户端使用 HTTP协议定义的方法来发送请求到这些 URIs,当然可能会导致这些被访问的”资源“状态的改变。

=================================================================

GET获取资源的信息 example.com/api/orders

GET获取某个特定资源的信息 example.com/api/orders/123

POST创建新资源 example.com/api/orders

PUT更新资源 example.com/api/orders/123

DELETE删除资源 example.com/api/orders/123

==================================================================

REST设计不需要特定的数据格式。在请求中数据可以以JSON形式,或者有时候作为 url中查询参数项。

坚持 REST的准则设计一个 web service或者 API的任务就变成一个标识资源被展示出来以及它们是怎样受不同的请求方法影响的练习。

比如说,我们要编写一个待办事项应用程序而且我们想要为它设计一个 web service。要做的第一件事情就是决定用什么样的根 URL来访问该服务。例如,我们可以通过这个来访问:

[hostname]/todo/api/v1.0/

在这里我已经决定在 URL中包含应用的名称以及 API的版本号。在 URL中包含应用名称有助于提供一个命名空间以便区分同一系统上的其它服务。在 URL中包含版本号能够帮助以后的更新,如果新版本中存在新的和潜在不兼容的功能,可以不影响依赖于较旧的功能的应用程序。

下一步骤就是选择将由该服务暴露(展示)的资源。这是一个十分简单地应用,我们只有任务,因此在我们待办事项中唯一的资源就是任务。

我们的任务资源将要使用 HTTP方法如下:

=======================================================================================

GET [hostname]/todo/api/v1.0/tasks检索任务列表

GET [hostname]/todo/api/v1.0/tasks/[task_id]检索某个任务

POST [hostname]/todo/api/v1.0/tasks创建新任务

PUT [hostname]/todo/api/v1.0/tasks/[task_id]更新任务

DELETE [hostname]/todo/api/v1.0/tasks/[task_id]删除任务

=======================================================================================

id:任务的唯一标识符。数字类型。

title:简短的任务描述。字符串类型。

description:具体的任务描述。文本类型。

目前为止关于我们的 web service的设计基本完成。剩下的事情就是实现它!

如果你读过Flask Mega-Tutorial系列,就会知道 Flask是一个简单却十分强大的 Python web框架。

在我们深入研究 web services的细节之前,让我们回顾一下一个普通的 Flask Web应用程序的结构。

我会首先假设你知道 Python在你的平台上工作的基本知识。我将讲解的例子是工作在一个类 Unix操作系统。简而言之,这意味着它们能工作在 Linux,Mac OS X和 Windows(如果你使用Cygwin)。如果你使用 Windows上原生的 Python版本的话,命令会有所不同。

让我们开始在一个虚拟环境上安装 Flask。如果你的系统上没有 virtualenv,你可以从pypi.python.org/pypi/virtualenv上下载:

New python executable in flask/bin/python

Installing setuptools............................done.

Installing pip...................done.

既然已经安装了 Flask,现在开始创建一个简单地网页应用,我们把它放在一个叫 app.py的文件中:

return"Hello, World!"if __name__=='__main__':

为了运行这个程序我们必须执行 app.py:

* Running on 127.0.0.1:5000/

现在你可以启动你的网页浏览器,输入localhost:5000看看这个小应用程序的效果。

简单吧?现在我们将这个应用程序转换成我们的 RESTful service!

使用 Python和 Flask实现 RESTful services

使用 Flask构建 web services是十分简单地,比我在Mega-Tutorial中构建的完整的服务端的应用程序要简单地多。

在 Flask中有许多扩展来帮助我们构建 RESTful services,但是在我看来这个任务十分简单,没有必要使用 Flask扩展。

我们 web service的客户端需要添加、删除以及修改任务的服务,因此显然我们需要一种方式来存储任务。最直接的方式就是建立一个小型的数据库,但是数据库并不是本文的主体。学习在 Flask中使用合适的数据库,我强烈建议阅读Mega-Tutorial。

这里我们直接把任务列表存储在内存中,因此这些任务列表只会在 web服务器运行中工作,在结束的时候就失效。这种方式只是适用我们自己开发的 web服务器,不适用于生产环境的 web服务器,这种情况一个合适的数据库的搭建是必须的。

我们现在来实现 web service的第一个入口:

'title': u'Buy groceries',

'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',

'title': u'Learn Python',

'description': u'Need to find a good Python tutorial on the web',

}]@app.route('/todo/api/v1.0/tasks', methods=['GET'])def get_tasks():

return jsonify({'tasks': tasks})if __name__=='__main__':

正如你所见,没有多大的变化。我们创建一个任务的内存数据库,这里无非就是一个字典和数组。数组中的每一个元素都具有上述定义的任务的属性。

取代了首页,我们现在拥有一个 get_tasks的函数,访问的 URI为/todo/api/v1.0/tasks,并且只允许 GET的 HTTP方法。

这个函数的响应不是文本,我们使用 JSON数据格式来响应,Flask的 jsonify函数从我们的数据结构中生成。

使用网页浏览器来测试我们的 web service不是一个最好的注意,因为网页浏览器上不能轻易地模拟所有的 HTTP请求的方法。相反,我们会使用 curl。如果你还没有安装 curl的话,请立即安装它。

通过执行 app.py,启动 web service。接着打开一个新的控制台窗口,运行以下命令:

Content-Type: application/json

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 04:53:53 GMT

"description":"Milk, Cheese, Pizza, Fruit, Tylenol",

"description":"Need to find a good Python tutorial on the web",

我们已经成功地调用我们的 RESTful service的一个函数!

现在我们开始编写 GET方法请求我们的任务资源的第二个版本。这是一个用来返回单独一个任务的函数:

task= filter(lambda t: t['id']== task_id, tasks)

return jsonify({'task': task[0]})

第二个函数有些意思。这里我们得到了 URL中任务的 id,接着 Flask把它转换成函数中的 task_id的参数。

我们用这个参数来搜索我们的任务数组。如果我们的数据库中不存在搜索的 id,我们将会返回一个类似 404的错误,根据 HTTP规范的意思是“资源未找到”。

如果我们找到相应的任务,那么我们只需将它用 jsonify打包成 JSON格式并将其发送作为响应,就像我们以前那样处理整个任务集合。

Content-Type: application/json

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:21:50 GMT

"description":"Need to find a good Python tutorial on the web",

$ curl-i localhost:5000/todo/api/v1.0/tasks/3

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:21:52 GMT

<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 3.2 Final//EN">

<title>404 Not Found</title>

<h1>Not Found</h1>

<p>The requested URL was not found on the server.</p><p>If you entered the URL manually please check your spelling and try again.</p>

当我们请求 id#2的资源时候,我们获取到了,但是当我们请求#3的时候返回了 404错误。有关错误奇怪的是返回的是 HTML信息而不是 JSON,这是因为 Flask按照默认方式生成 404响应。由于这是一个 Web service客户端希望我们总是以 JSON格式回应,所以我们需要改善我们的 404错误处理程序:

return make_response(jsonify({'error':'Not found'}), 404)

Content-Type: application/json

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:36:54 GMT

接下来就是 POST方法,我们用来在我们的任务数据库中插入一个新的任务:

if not request.json or not'title' in request.json:

'id': tasks[-1]['id']+ 1,

'title': request.json['title'],

'description': request.json.get('description',""),

return jsonify({'task': task}), 201

添加一个新的任务也是相当容易地。只有当请求以 JSON格式形式,request.json才会有请求的数据。如果没有数据,或者存在数据但是缺少 title项,我们将会返回 400,这是表示请求无效。

接着我们会创建一个新的任务字典,使用最后一个任务的 id+ 1作为该任务的 id。我们允许 description字段缺失,并且假设 done字段设置成 False。

我们把新的任务添加到我们的任务数组中,并且把新添加的任务和状态 201响应给客户端。

使用如下的 curl命令来测试这个新的函数:

Content-Type: application/json

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:56:21 GMT

注意:如果你在 Windows上并且运行 Cygwin版本的 curl,上面的命令不会有任何问题。然而,如果你使用原生的 curl,命令会有些不同:

当然在完成这个请求后,我们可以得到任务的更新列表:

Content-Type: application/json

Server: Werkzeug/0.8.3 Python/2.7.3

Date: Mon, 20 May 2013 05:57:44 GMT

"description":"Milk, Cheese, Pizza, Fruit, Tylenol",

"description":"Need to find a good Python tutorial on the web",

task= filter(lambda t: t['id']== task_id, tasks)

if'title' in request.json and type(request.json['title'])!= unicode:

if'description' in request.json and type(request.json['description']) is not unicode:

在Python中调用第三方 API接口并将数据写入数据库可分为以下几个步骤:

使用 requests库发送 HTTP请求,并使用 PyMySQL库连接 MySQL数据库。您可以使用以下命令在 Python中安装这两个库:

使用 requests库向第三方 API发送请求,获取到需要存储到数据库的数据。

例如,以下代码通过调用和风天气 API获取天气数据:

r=requests.get('api.heweather.net/s6/weather/now?location=beijing&key=your_key')

data= r.json()#将请求的结果转换为JSON格式数据

根据 API返回的数据格式,提取需要存入数据库的字段数据。您可以使用字符串操作或 JsonPath等库来提取数据。

例如,以下代码从 API返回数据中提取出温度(tmp)和湿度(hum)字段的值:

tmp= data['HeWeather6'][0]['now']['tmp']

hum= data['HeWeather6'][0]['now']['hum']

使用 PyMySQL库连接 MySQL数据库。请确保您已经安装 PyMySQL库,并且数据库信息是正确的。

例如,以下代码连接本地 MySQL数据库:

conn=pymysql.connect(host='localhost', user='root', password='123456', db='my_db', charset='utf8mb4')

使用 PyMySQL库将数据写入数据库中。

例如,以下代码将温度和湿度数据插入到 weather表中:

#表名:weather,字段:tmp、hum

sql="INSERT INTO weather(tmp, hum) VALUES(%s,%s)"

cursor.execute(sql,(tmp, hum))

print('数据插入成功!')

print('数据插入失败!', e)

r=requests.get('api.heweather.net/s6/weather/now?location=beijing&key=your_key')

#处理 API返回数据,提取温度和湿度

tmp= data['HeWeather6'][0]['now']['tmp']

hum= data['HeWeather6'][0]['now']['hum']

conn= pymysql.connect(host='localhost', user='root', password='123456', db='my_db', charset='utf8mb4')

#表名:weather,字段:tmp、hum

sql="INSERT INTO weather(tmp, hum) VALUES(%s,%s)"

cursor.execute(sql,(tmp, hum))

print('数据插入成功!')

print('数据插入失败!', e)

在本例中,我们假设使用的是 MySQL数据库,当然也可以使用其他类型的数据库,具体操作方式可能会略有不同,但是主要的操作步骤是类似的。

wwW.Xtw.Com.cN系统网专业的PC、手机系统开发下载平台,HarmonyOS系统、安卓、OS、windows电脑重装系统在线下载安装,操作系统平台技术学习,攻略教程,技术交流。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com