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标准进行编码。

ca7cd339cf0e4c20994a3c209802ca85.png

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

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编码两次,会怎么样呢?

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。

等等。

print(str({"A":1, "B":True}))
#运行结果:
#{'A': 1, 'B': True}

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

{"A": 1, "B": true}

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

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

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

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

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的字典

json.loads(response)

以那个简单的字典为例,先将其转化为JSON,然后再将其转化回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博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/440435.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

18734 拓扑排序

### 思路 1. **建模问题**&#xff1a;将课程和依赖关系建模为有向图&#xff0c;其中课程是节点&#xff0c;依赖关系是有向边。 2. **选择算法**&#xff1a;使用拓扑排序算法来确定课程的学习顺序。由于需要确保输出唯一性&#xff0c;同等条件下编号小的课程排在前面&…

fastAPI教程:路由操作及HTTP请求响应

FastAPI 三、路由操作 3.1 路由装饰器 路由装饰器&#xff0c;也叫路径操作装饰器。 FastAPI提供了一系列基于HTTP请求作为方法名的装饰器给开发者用于绑定url地址提供给外界操作API接口。 HTTP方法FastAPI代码描述GETapp.get()async 方法名(): pass获取数据POSTapp.post(…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.5-2.6

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第二周 深度卷积网络&#xff1a;实例探究&#xff08;Deep convolutional models: case studies&#xff09;2.5 网络中的网络以及 11 卷积&#xff08;Network in Network and 11 convoluti…

【AI知识点】批归一化(Batch Normalization)

批归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09; 是一种用于加速神经网络训练并提高模型稳定性的方法&#xff0c;最早由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。批归一化通过在每一层对神经网络中的激活值进行标准化&#xff0c;使得每一层的…

D29【python 接口自动化学习】- python基础之输入输出与文件操作

day29 格式化输出 学习日期&#xff1a;20241006 学习目标&#xff1a;输入输出与文件操作&#xfe63;-41 格式化输出&#xff1a;如何将执行结果通过屏幕输出&#xff1f; 学习笔记&#xff1a; 三种常用的格式化输出方式 百分号方式 format函数方式 总结 1. 格式化输出…

在ubuntu好部署jenkins发布vue项目时遇到的一些问题及解决方法以及使用jenkins发布vue项目-npm自动打包发布的实现

一、在ubuntu好部署jenkins发布vue项目时遇到的一些问题及解决方法 1. 问题&#xff1a;webpack-dev-server不是内部或外部命令&#xff0c;也不是可运行的程序 解决&#xff1a;使用webpack要安装webpack-cli这个包&#xff0c;才可以调用webpack和webpack-dev-server这些命…

Hive3.x版本调优总结

文章目录 第 1 章 Explain 查看执行计划&#xff08;重点&#xff09;1.1 创建测试用表1&#xff09;建大表、小表和 JOIN 后表的语句2&#xff09;分别向大表和小表中导入数据 1.2 基本语法1.3 案例实操 第 2 章 Hive 建表优化2.1 分区表2.1.1 分区表基本操作2.1.2 二级分区2.…

虚拟机 VMware 安装 macOS

macOS 界面 MAC OS IOS下载&#xff1a; amacOS Monterey by Techrechard.comwmacOS Monterey by Techrechard.com 下载&#xff1a;Unlocker-v2.0.1-x64 Mac OS X 虚拟机中更改屏幕分辨率 终端输入命令&#xff1a; sudo defaults write /Library/Preferences/com.apple.w…

2-114 基于matlab的CA模型

基于matlab的CA模型&#xff0c;Singer模型对单机动目标进行跟踪算法&#xff0c;具有10页实验文档。采用蒙特卡罗方法对一个二坐标雷达对一平面上运动的目标进行观测&#xff0c;得到跟踪滤波结果。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-114 …

Linux:进程的创建、终止和等待

一、进程创建 1.1 fork函数初识 #include pid_t fork(void); 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 调用fork函数后&#xff0c;内核做了下面的工作&#xff1a; 1、创建了一个子进程的PCB结构体、并拷贝一份相同的进程地址…

Stable Diffusion绘画 | IP角色多视图生成技巧

在游戏设计、小说推文、角色设计里面&#xff0c;很多场景都运用到IP角色的多视图。 人物角色多视图 第1步&#xff0c;输入提示词&#xff1a; 第2步&#xff0c;由于要在同一张图片中生成多角度的并排展示&#xff0c;需要修改图片的分辨率&#xff08;尤其是宽度&#xff…

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型)

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 目录 Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 1. 项目说明 2. 数据说明 &#xff08;1&#xff09;心跳信号分类预测数据集 3. 模型训练 &#xff08;1&#xff09;项目安装 &am…

MoveIt2-humble----在 RViz 中实现可视化

官方文档上的教程&#xff0c;从moveit1的melodic到moveit2的foxy基本一致&#xff0c;但是从最新的humble开始有了很大的变化&#xff0c;其中之一便是 lambda表达式 的广泛使用。 本节为教程的第二节&#xff0c;会介绍一个工具&#xff08;moveit_visual_tools&#xff09;…

运动员场景分割系统源码&数据集分享

运动员场景分割系统源码&#xff06;数据集分享 [yolov8-seg-HGNetV2&#xff06;yolov8-seg-aux等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al lnnovati…

麒麟 操作系统介绍| 银河麒麟和中标麒麟操作系统| Kylin 麒麟iso 镜像下载地址 银河麒麟操作系统v10 |

目录 #申请试用小技巧&#xff0c; 所有麒麟系列的版本如下 详细介绍如下&#xff1a; 银河麒麟高级服务器操作系统 V10 1. 龙芯-MIPS64el 版 2. 申威版 3. 兆芯版 4. 海光版 5. 飞腾版 6. 鲲鹏版 7. AMD64版 8. 龙芯-LoongArch64 版 9. ARM64版 银河麒麟桌面操作…

SpringMVC源码-AbstractUrlHandlerMapping处理器映射器将实现Controller接口的方式定义的路径存储进去

DispatcherServlet的initStrategies方法用来初始化SpringMVC的九大内置组件 initStrategies protected void initStrategies(ApplicationContext context) {// 初始化 MultipartResolver:主要用来处理文件上传.如果定义过当前类型的bean对象&#xff0c;那么直接获取&#xff0…

【学习笔记】kruskal重构树

前言 最近一场div2没开出C2&#xff0c;猛掉104分。 赛后补E&#xff0c;发现自己连E1都没思路&#xff0c;一问才知道是kruskal重构树。 好吧&#xff0c;OI时期欠下的债该还了。 kruskal重构树是什么 它是一棵 2 n − 1 2n-1 2n−1 个点的二叉树。点有点权&#xff0c;下…

异常场景分析

优质博文&#xff1a;IT-BLOG-CN 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件&#xff0c;当事件发生后&#xff0c;…

https访问报错:net::ERR_CERT_DATE_INVALLD

目录 简介异常排查原因解决补充 简介 访问https资源出现报错 异常 排查 将地址拿到浏览器进行访问&#xff0c;可以很清晰的看到出现该问题的原因 原因 1、SSL证书已过期 2、服务器日期不准&#xff0c;不在证书有效期 解决 1、重新申请SSL证书&#xff0c;并配置 2、校正…

VMware桥接模式无法连接网络

windows下打开控制面板&#xff0c;找到WLAN&#xff0c;记住下面的名称&#xff08;带有VMware的都是虚拟机的网卡&#xff0c;要找到物理主机的网卡&#xff09; 回到VMware&#xff0c;编辑——打开虚拟网络编辑器 桥接选择上面的WLAN下的网络名称&#xff0c;确定即可。&…