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

news2024/12/27 10:53:35

前言

我们知道,当需要设计一个程序和服务器进行交互时,往往会用到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.coloradmin.cn/o/2185978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习模型算法

前言 机器学习离不开数据、和模型算法&#xff0c;常用的套路包含数据预处理、模型学习、模型评估、样本预测几个步骤。 数据预处理&#xff1a;从原始raw数据&#xff0c;经过&#xff08;特征处理幅度缩放、特征选择、维度约减、采样&#xff09;&#xff0c;输出测试集和训…

Java 16Java 17(LTS版本)新特性概述

一、Java 16 发布于2021年3月16日。Java 16主要特性有&#xff1a; JEP 338&#xff1a;Vector API (Incubator) 向量 API&#xff08;第一轮孵化&#xff09; JEP 387&#xff1a;Elastic Metaspace 弹性元空间 JEP 389&#xff1a;Foreign Linker API (Incubator) 外部链接…

鸿蒙OpenHarmony

开源鸿蒙系统编译指南 Ubuntu编译环境配置第一步&#xff1a;Shell 改 Bash第二步&#xff1a;安装Git和安装pip3工具第三步&#xff1a;远程仓配置第四步&#xff1a;拉取代码第五步&#xff1a;安装编译环境第六步&#xff1a;本地编译源码 Windows开发环境配置第一步&#x…

生信初学者教程(二十四):筛选交集特征

文章目录 介绍加载R包导入数据重叠的重要特征重要特征的韦恩图输出结果总结介绍 在数据分析和机器学习项目中,特征选择是一个至关重要的步骤,它有助于识别数据集中与目标变量最相关的特征。当通过不同的机器学习方法筛选出重要特征时,对这些特征取交集以识别核心特征,是一种…

【重学 MySQL】五十、添加数据

【重学 MySQL】五十、添加数据 使用INSERT INTO语句添加数据基本语法示例插入多行数据注意事项 使用LOAD DATA INFILE语句批量添加数据其他插入数据的方式注意事项 在MySQL中&#xff0c;添加数据是数据库操作中的基本操作之一。 使用INSERT INTO语句添加数据 使用 INSERT IN…

资源《Arduino UNO R3 proteus 仿真工程》说明。

资源链接&#xff1a; Arduino UNO R3 proteus 仿真工程 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为proteus工程&#xff0c;用于Arduino uno r3仿真。 因为软件自动运行&#xff0c;所以最小系统上没有…

全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串

全网最适合入门的面向对象编程教程&#xff1a;55 Python 字符串与序列化-字节序列类型和可变字节字符串 摘要&#xff1a; 在 Python 中&#xff0c;字符编码是将字符映射为字节的过程&#xff0c;而字节序列&#xff08;bytes&#xff09;则是存储这些字节的实际数据结构&am…

论文笔记:iCaRL: Incremental Classifier and Representation Learning

1. Contribution 提出了一种新的训练策略&#xff0c;iCaRL&#xff1a;允许以增量方式学习&#xff1a;只需要同时存在一小部分类别的训练数据&#xff0c;新类别可以逐步添加。同时学习分类器和数据表示&#xff1a;iCaRL能够同时学习强大的分类器和数据表示&#xff0c;这与…

OpenGL ES MVP/变换投影矩阵(8)

OpenGL ES MVP/变换投影矩阵(8) 简述 通过前面几节的学习&#xff0c;目前我们已经可以渲染自己想要的图像&#xff0c;也可以通过纹理加载图片进行渲染。接下来我们来学习一下MVP&#xff0c;这里的MVP不是Android应用开发里的框架MVP&#xff0c;而是Model&#xff0c;View…

电场能量磁场能量相等,注意电场能量公式也没有复数形式(和坡印廷类似)

下面是电场能量密度和磁场能量密度的公式&#xff0c;注意这可不是坡印廷定理。且电场能量密度没有复数表达式&#xff0c;即不是把E和D换成复数形式就行的。注意&#xff0c;一个矢量可以转化为复数形式&#xff0c;两个矢量做运算不能转化为两个复数形式的矢量做运算&#xf…

什么是SPI机制

什么是SPI机制 SPI机制是Java平台提供的一种强大的动态扩展机制&#xff0c;能够让程序在运行时灵活地加载和使用服务提供者的实现类。我们这里带大家简单的了解一下SPI机制是如何工作的 SPI&#xff08;Service Provider Interface&#xff0c;服务提供者接口&#xff09;机制…

JavaScript while循环语句

While语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断循环执行代码块。 while(条件){语句;} var i0;while(i<100){console.log(i);i1;} 注意&#xff1a;所有的for循环都可以改写为while循环

Spring Boot 和 MyBatis-Plus凑一块儿了,这份教程你得看

一、引言 MyBatis-Plus 是 MyBatis 的增强版&#xff0c;提供了 CRUD 接口、分页插件、性能分析插件等特性&#xff0c;简化了开发过程。本文将详细介绍如何在 Spring Boot 项目中集成 MyBatis-Plus。 支持的数据看也越来越多&#xff0c;值得去搞一下&#xff0c;写了一个小例…

《PMI-PBA认证与商业分析实战精析》第5章 需求启发与分析

第5章 需求启发与分析 本章主要内容&#xff1a; 需求启发 需求分析 模型化与优化需求 记录、确认、核实和批准需求 本章涵盖的考试重点&#xff1a; 需求启发的四项活动 需求启发的八项技术 启发提问的四种类型问题 启发原型的类型 访谈的四种分类 观察技术的四种类…

华三资源

华三华三官方网站华三公司官网新华三 - 融绘数字未来&#xff0c;共享美好生活华三华三文档中心华三文档资源文档中心-新华三集团-H3C华三华三 ICT百科华三 ICT知识百科H3C ICT知识百科-新华三集团-H3C华三华三文档高级查找高级文档搜索新华三 - 融绘数字未来&#xff0c;共享美…

已解决:Could not find artifact xxx

已解决&#xff1a;Could not find artifact xxx 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 检查依赖声明的正确性2. 检查远程仓库配置3. 检查网络连接4. 清理本地缓存并强制更新5. 手动上传依赖到私有仓库6. 检查本地仓库是否已被损坏 总结 写在前面 在使用…

V2V迁移:vsphere至openstack

预检查 检测待迁移实例是否已安装并配置virtio相关的块设备驱动、网卡驱动&#xff0c;linux包括kernel、initramfs&#xff0c;windows包括磁盘控制器、网卡。 Linux 系统检查 Virtio 驱动 Windows 系统检查 Virtio 驱动 环境 1、下载安装ovftool 2、安装qemu-kvm&#x…

数据结构-二叉树介绍及其在Java中遍历算法实现

一、二叉树介绍 1、二叉树(Binary tree)的定义 二叉树(binary tree)是树形结构的一个重要类型,是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右…

Angular基础学习(入门 --> 入坑)

目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 &#xff08;ViewChild&#xff09; 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …

SuperMap iClient for MapLibreGL 根据SQL条件过滤显示动态图层

查阅发现iClient 有子图层控制类 LayerStatus 可实现&#xff1a;子图层显示参数类。此类存储了各个子图层的名称、是否可见的状态、SQL 过滤条件等参数。 API详情&#xff1a;http://support.supermap.com.cn:8090/iserver/iClient/forJavaScript/docs/maplibregl/LayerStatus…