PYTHON实现HTTP request的一些有用的函数

前言

我们知道,当需要设计一个程序和服务器进行交互时,往往会用到HTTP的request,即服务器有一个对外接口REST API,因此当向服务器发送符合格式要求的HTTP request时,服务器会给出响应,甚至执行一些任务。如需了解详情,请阅读[1]

PYTHON是一种常见的编程语言,可以发送HTTP request,并接受从服务器中得到的反馈。博客[2]中说明了一种使用PYTHON发送HTTP request并接受反馈数据的方法。当然,也可以使用JAVA,Swift,C#,Javascript等编程语言实现类似功能。

在AGV项目中,HTTP request可以用于和AGV调度服务器进行交互,调度服务器有REST API。因此,要设计一个给AGV发送任务,管理任务,实时监测AGV以及外部设备(如电梯,卷帘门)的状态等的程序,可以用PYTHON写一个通过HTTP request和AGV调度服务器交互的程序。该程序就相当于调度服务器的客户端。

由于[2]中已经说明了PYTHON使用HTTP request的基本方法,本文不赘述。本文主要介绍一些有用的函数。

一、URL格式转化函数

URL所能接受的格式,和自然语言的格式是有区别的。例如,某AGV调度系统中,获取某车信息的URL是:http://<服务器地址>:<端口>/agv/<车名>?&property=<属性名列表>。那么如果服务器在本地,端口为6000,车名是"Vehicle A",要获取的属性包括"location","speed",那么URL应该是:http://127.0.0.1:6000/agv/Vehicle A?&property=["location","speed"]。但显然这是不行的,因为URL编码不支持空格,括号,引号等字符。通常,URL的编码标准是RFC1738[3]。网站[3]可用于将URL按照RFC1738标准进行编码。

PYTHON中同样有这样的程序,这个程序包就是urllib.parse,里面的quote函数就可实现该功能。

python 复制代码
from urllib import parse
print(parse.quote('http://127.0.0.1:6000/agv/Vehicle A?&property=["location","speed"]'))
#运行结果:
#'http%3A//127.0.0.1%3A6000/agv/Vehicle%20A%3F%26property%3D%5B%22location%22%2C%22speed%22%5D'

虽然显示和上图略有不同,但不会影响URL的解析。该URL可以正确解析。

注意:请勿在已编码的URL上再进行编码操作,否则会导致结果错误!

如果对一个URL编码两次,会怎么样呢?

python 复制代码
from urllib import parse
encodedURL = parse.quote('http://127.0.0.1:6000/agv/Vehicle A?&property=["location","speed"]')
print(parse.quote(encodedURL))
#运行结果:
#http%253A//127.0.0.1%253A6000/agv/Vehicle%2520A%253F%2526property%253D%255B%2522location%2522%252C%2522speed%2522%255D

显然,结果是错误的。如果用这样的URL发出请求一定会出错。

二、PYTHON字典和POST request的发送数据的相互转化函数

PYTHON字典的格式和发送HTTP request的POST请求带上的数据常见格式JSON十分相似,但也有区别,例如,

  1. PYTHON字典用字符串表示时,里面的引号通常是单引号。但在JSON中应为双引号。

  2. PYTHON字典里的布尔量是True和False,但在JSON中应为true和false。

等等。

python 复制代码
print(str({"A":1, "B":True}))
#运行结果:
#{'A': 1, 'B': True}

JSON格式见[4]。所以这里应该是

javascript 复制代码
{"A": 1, "B": true}

博文[2]中给出了一种把PYTHON字典转化为JSON数据的方式,但其实还有另一种方法,就是利用PYTHON中的json包。

(一)将PYTHON字典转化为JSON数据

python 复制代码
import json
print(json.JSONEncoder().encode({"A":1, "B":True}))
#运行结果:
#{"A": 1, "B": true}

以上代码,将PYTHON字典转换成了JSON格式,可用于通过HTTP request发送给服务器。

python 复制代码
from urllib.request import Request
data = json.JSONEncoder().encode({"A":1, "B":True}).encode('utf-8')
req = Request(request_path, data=data, method=method, headers=header)
response = request.urlopen(req, data, timeout=timeout).read().decode('utf-8')

(二)将JSON数据转为PYTHON字典

上述代码中的response是服务器返回的JSON格式字符串,也可通过json包里的一个函数loads将其转化为python的字典

python 复制代码
json.loads(response)

以那个简单的字典为例,先将其转化为JSON,然后再将其转化回PYTHON字典

python 复制代码
data_byte = json.JSONEncoder().encode({"A":1, "B":True}).encode('utf-8') #这步将字典转化为JSON
print(data_byte)
#b'{"A": 1, "B": true}'
data_dict = json.loads(data_byte.decode('utf-8'))#这步将JSON转化回字典
print(data_dict)
#{'A': 1, 'B': True}
print(type(data_dict))
#<class 'dict'>

链接

[1]【网络原理】HTTP 请求 (Request)详解_request请求-CSDN博客

[2]Python爬虫入门:urllib.request.Request详解-CSDN博客

[3]URL Encode Online | URLEncoder

[4]json格式-CSDN博客

相关推荐
凤枭香8 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺16 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森20 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
阑梦清川1 小时前
JavaEE初阶---网络原理(五)---HTTP协议
网络·http·java-ee
阿尔帕兹1 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空2 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划