本章中我们将来看SOAP和REST API的基础知识。我们还会看实现SOAP和REST API的Python库。我们将学习Zeep库来使用SOAP和requests来使用REST API。我们将学习操作JSON数据的知识。接着看一个操作JSON数据的简单示例,比如将JSON字符串转化成Python对象和将Python对象转换成JSON字符串。
本章中我们将学习如下内容:
- SOAP是什么?
- 通过库使用SOAP
- 什么是RESTful API?
- 通过标准库使用RESTful API
- 操作JSON数据
SOAP是简单对象访问协议(Simple Object Access Protocol)。SOAP是一各路标准通讯协议,允许使用不同操作系统的进程。它通过HTTP和XML进行通讯,是一个web服务技术。SOAP API主要设计用于创建、更新、删除和还原数据的操作。SOAP API使用Web服务描述语言来描述web服务所提供的功能。SOAP描述所有功能和数据类型。它建立一个基于XML的协议。
这一部分中,我们将学习SOAP的Python库。有用于SOAP的不同库列举如下:
- SOAPpy
- Zeep
- Ladon
- suds-jurko
- pysimplesoap
这些是Python中用于SOAP API的库。这一部分中我们仅会学习Zeep库。
要使用Zeep的功能,我们首先需要安装它。在终端中运行如下命令来安装Zeep:
$ pip3 install Zeep
Zeep模块是用于WSDL(Web Services Description Language)的文档。它生成服务的代码和文档并提供SOAP服务端的编程接口。lxml库用于解析XML文档。
下面我们来看一个示例。创建脚本soap_example.py并在其中编写如下代码:
import zeep
w = 'http://www.soapclient.com/xml/soapresponder.wsdl'
c = zeep.Client(wsdl=w)
print(c.service.Method1('Hello', 'World'))
运行脚本,我们将得到如下输出:
$ python3 soap_example.py
# 输出结果:
Your input parameters are Hello and World
上例中,我们首先导入了zeep模块。第一步传入了网站名。然后创建了一个zeep客户端对象。前面使用的WSDL定论了一个简单的Method1函数,由zeep通过client.service.Method1来提供。它接收两个参数并返回一个字符串。
REST表示表述性状态传递(Representational State Transfer)。RESTful API有一种在web服务开发中使用的通讯方法。它是可作为因特网上不同系统间通信的通道的一类web服务。是一个应用接口,用于使用HTTP请求来对数据进行GET, PUT, POST和DELETE。
REST的优点是它使用更少的代码,非常适合在因特网上使用。REST API 使用统一接口。所有的资源通过GET, PUT, POST和DELETE运算处理。REST API使用GET来获取资源、PUT来更新资源或修改资源的状态,使用POST来创建资源,并使用DELETE来删除资源。系统使用REST API来达到更快的性能和可靠性。
REST API独立处理每一个请求。客户端向服务端发送的请求必须包含可用于了解请求内容的所有信息。
这一部分,我们将学习如何使用RESTful API。要进行使用,我们需要用到Python的requests和JSON模块。下面我们来看一个示例。首先,我们将使用requests模块来从API获取信息。会用到GET和POST请求。
我们必须先安装requests库,方法如下:
$ pip3 install requests
下面我们会看一个示例。创建脚本rest_get_example.py并在其中编写如下内容:
import requests
req_obj = requests.get('https://www.imdb.com/news/top?ref_=nv_tp_nw')
print(req_obj)
运行该脚本,我们将得到如下输出:
$ python3 rest_get_example.py
# 输出结果:
<Response [200]>
上例中,我们导入了requests模块来获取请求。接着我们创建了一个请求对象req_obj,并从想要获取请求之处指定了一个链接。然后,我们进行了打印。所得到的输出是状态码200,表示访问成功。
下面我们将看一个POST请求示例。POST请求用于向服务器发送数据。创建一个脚本rest_post_example.py并在其中编写如下内容:
import requests, json
url_name = 'http://httpbin.org/post'
data = {"Name": "John"}
data_json = json.dumps(data)
headers = {'Content-Type': 'application/json'}
response = requests.post(url_name, data=data_json, headers=headers)
print(response)
运行该脚本,我们将得到如下输出:
$ python3 rest_post_example.py
# 输出结果:
<Response [200]>
在上例中,我们学习了POST请求。首先我们导入了必要的模块requests和JSON。然后传入了URL。同时,我们以字典格式输出想要进行post的数据。然后,我们传入了headers。接着使用POST请求进行了post。我们得到的输出是状态码是200, 是一个成功状态码。
这一部分中,我们将学习JSON数据。JSON表示JS对象简谱(JavaScript Object Notation)。JSON是一个数据交换格式。它将Python对象以JSON字符串编码,并将JSON字符串解码为Python对象。Python有一个JSON模块来格式化JSON输出。它带有对JSON序列化和反序列化的函数。
- json.dump(obj, fileObj):这一函数会将对象序列化为JSON格式流
- json.dumps(obj):这个函数会序列化对象为JSON格式字符串
- json.load(JSONfile):该函数会将JSON文件反序列化为Python对象
- json.loads(JSONfile):该函数会将字符串类型JSON文件反序列化为Python对象
这还有两个用于编码和解码的类,列出如下:
- JSONEncoder:用于将Python对象转换为JSON格式
- JSONDecoder:用于将JSON格式文件转换为Python对象
下面我们来看使用JSON模块的一些示例。首先我们来看从JSON到Python的转换。创建一个脚本json_to_python.py 并在其中编写如下内容:
import json
j_obj = '{"Name": "Harry", "Age": 26, "Department": "HR"}'
p_obj = json.loads(j_obj)
print(p_obj["Name"])
print(p_obj["Department"])
运行脚本,我们将得到如下输出:
$ python3 json_to_python.py
# 输出结果:
Harry
HR
上例中,我们编写了将一个JSON字符串转换为Python对象的一段代码。json.loads()函数用于将JSON字符串转换为Python对象。
下面我们来看如何将Python对象转换为JSON。创建一个脚本python_to_json.py并在其中编写如下代码:
import json
emp_dict1 = '{"Name":"Harry", "Age":26, "Department":"HR"}'
json_obj = json.dumps(emp_dict1)
print(json_obj)
运行脚本,我们将得到如下输出:
$ python3 python_to_json.py
# 输出结果:
"{"Name":"Harry", "Age":26, "Department":"HR"}"
上例中,我们将一个Python对象转换为了一个JSON字符串。 json.dumps()函数用于这一转换。
下面,我们来看如何将不同类型的Python对象转换为JSON字符串。创建一个脚本python_object_to_json.py并在其中编写如下内容:
import json
python_dict = {"Name": "Harry", "Age":26}
python_list = ["Numbai", "Pune"]
python_tuple = ("Basketball", "Cricket")
python_str = ("hello_world")
python_int = (150)
python_float = (59.66)
python_T = (True)
python_F = (False)
python_N = (None)
json_obj = json.dumps(python_dict)
json_arr1 = json.dumps(python_list)
json_arr2 = json.dumps(python_tuple)
json_str = json.dumps(python_str)
json_num1 = json.dumps(python_int)
json_num2 = json.dumps(python_float)
json_t = json.dumps(python_T)
json_f = json.dumps(python_F)
json_n = json.dumps(python_N)
print("json object : ", json_obj)
print("json array1 : ", json_arr1)
print("json array2 : ", json_arr2)
print("json string : ", json_str)
print("json number1 : ", json_num1)
print("json number2` : ", json_num2)
print("json true` : ", json_t)
print("json false` : ", json_f)
print("json null` : ", json_n)
运行脚本,我们将得到如下输出:
$ python python_object_to_json.py
# 输出结果:
('json object : ', '{"Age": 26, "Name": "Harry"}')
('json array1 : ', '["Numbai", "Pune"]')
('json array2 : ', '["Basketball", "Cricket"]')
('json string : ', '"hello_world"')
('json number1 : ', '150')
('json number2` : ', '59.66')
('json true` : ', 'true')
('json false` : ', 'false')
('json null` : ', 'null')
上例中,我们使用json.dumps()函数将不同类型的Python对象转换成了JSON字符串。在转换之后,Python列表和元组被转换成了数据。整型和浮点型数字被看作JSON数字类型。下表中显示Python与JSON的对应转换:
| Python | JSON |
|---|---|
| dict | Object |
| list | Array |
| tuple | Array |
| str | String |
| int | Number |
| float | Number |
| True | true |
| False | false |
| None | null |
本章中,我们学习了SOAP API和RESTful API。还学习了用于SOAP API的Python库zeep和用于REST API的库requests。同时学习了如何处理JSON数据,如将JSON转换为Python及其反向转换。
下一章中,我们将学习网页爬取和实现这一任务的Python库。
-
SOAP 和 REST API之间的区别是什么?
-
json.loads和json.load之间的区别是什么?
-
JSON是否支持所有平台?
-
以下代码片断的输出是什么?
boolean_value = False print(json.dumps(boolean_value)) -
以下代码片断的输出是什么?
weird_json = '{"x": 1, "x": 2, "x": 3}' json.loads(weird_json)