前言

前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在学习Http请求相关的内容,所以决定总结一下各类Post请求的Python实现。

Happy post man

这里说的各类Post请求主要包含json格式、xml格式、文件上传(form-data)、及默认传递的urlencoded。在开始介绍相关的Python用法之前,我们首先我们来了解一下HTTP的报文结构。

HTTP的报文结构

上面这张图是Fiddle捕获的一个实际请求报文,它清晰的展示了HTTP 消息的结构。详情如下:

  • 请求行:即第一排用空格分割成的三个小块,分别对应请求方法、请求URL、HTTP协议版本三个部分。
  • 请求头:从第二行开始到倒数第二行都是我们的请求头(headers)。
  • 消息主体:截图的最后一行是请求体,也就是我们要发送的数据的主体,消息主体(entity-body)。

    也就是说一个正常的post请求主要由请求行,请求头,消息主体组成。接下来我们来了解一下什么是Content-Type。

Content-Type的定义

要了解Content-Type首先我们要先对HTTP/1.1 协议有一定的了解。

众所周知,HTTP/1.1 规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 8种,其中 POST 一般用来向服务端提交数据。

但是可能很多人不知道的是,虽然HTTP/1.1协议规定 了POST 提交的数据必须放在消息主体(entity-body)中,但并没有规定数据必须使用什么样的编码方式。也就是说,开发者完全可以自己决定消息主体的格式。

但是数据除了请求方发送之外,还要服务端能够解析才有意义。而这个解析操作的第一步通常就是是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体的编码方式,然后再对数据进行对应的解析操作。也就是说请求头中的Content-Type字段用于规定请求体的编码格式,服务端代码需要使用它对接收到的消息主体进行解析。

Content-Type的格式种类

我们前面说了HTTP/1.1没有规定协议编码方式,但是随着协议的应用推广,已经慢慢的形成了四种最常用的编码方式,基本上形成了相应的规范,即基本固定的Content-Type取值application/x-www-form-urlencoded(默认格式)、application/json、text/xml、multipart/form-data,与默认传递的urlencoded、json格式、xml格式、文件格式一 一对应。

接下来我们会每个编码方式的应用场景及Python实现分别进行介绍。我们此次主要使用http://httpbin.org/来做演示。

httpbin是一个专门用来测试 HTTP 请求及响应的网站,其github开源地址是https://github.com/requests/httpbin。作者另外一个开源库就是大名鼎鼎的requests,它也是我们演示代码中重要的部分。

application/x-www-form-urlencoded格式

这是post请求最常见也是默认的数据提交格式。它要求数据名称(name)和数据值(value)之间以等号相连,与另一组name/value值之间用&相连。例如:parameter1=12345&parameter2=23456。将请求的内容进行格式化了,其实这个方法同时简化的客户端发送,也简化了服务器端获取,服务器通过getParameters(String name)即可获取到传送来的信息。这是最常见post提交数据的方式,以form表单形式提交数据。

参考Python实现

import requests
datas = {"param1": "Detector", "param2": "cnblogs"}
r = requests.post("http://httpbin.org/post", data=datas)
print(r.text)
print(r.status_code)

我们在代码中没有进行Content-Type的设置,但是我们来看看Fiddler抓包的结果。

可以看到Content-Type已经被自动填充为application/x-www-form-urlencoded了。

application/json格式

application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

参考Python实现

import json
import requests
headers = {'Content-Type': 'application/json'}
datas = json.dumps({"param1": "Detector", "param2": "cnblogs"})
r = requests.post("http://httpbin.org/post", data=datas, headers=headers)
print(r.text)

有兴趣的朋友可以尝试不添加请求头,抓包看看结果。

Fiddler抓包结果

text/xml数据格式

它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC(XML Remote Procedure Call) 请求数据是这样的:

<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>

参考Python实现

import requests
headers = {"Content-Type": "text/xml"}
datas = """<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>"""
r = requests.post("http://httpbin.org/post", data=datas, headers=headers)
print(r.text)

可以看到,我们和application/json请求的区别是,我们把请求的内容换成了xml格式的字符串,Content-Type换成了text/xml。

Fiddler抓包结果

multipart/form-data数据格式

multipart/form-data主要用于文件上传,当我们使用它时,必须让 form表单的enctype 等于 multipart/form-data。直接来看一个请求示例,主要实现了上传本地的test.txt文件:

参考Python实现

import requests
files = {"file": open("C:/Users/Administrator/Desktop/test.txt", "rb")}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)

Fiddler抓包结果

参考资料

https://www.cnblogs.com/aaronjs/p/4165049.html

https://blog.csdn.net/u010256388/article/details/68491509

https://www.jianshu.com/p/3c790e98ea8d

https://www.cnblogs.com/softidea/p/5745369.html

https://blog.csdn.net/qq_39640877/article/details/80951327

【Python】Http Post请求四种请求体的Python实现的更多相关文章

  1. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

  2. python3+requests:post请求四种传送正文方式(详解)

    前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等,可以参考Get,Post请求方式经典详解进行学习一下. 我 ...

  3. post请求四种传送正文的方式

    一.简介 HTTP协议规定post提交的数据必须放在消息主体(entity-body)中,但协议没有规定数据必须使用什么编码方式.HTTP协议是以ASCII码传输,建立再TCP/IP协议之上的应用层规 ...

  4. 接口测试中模拟post四种请求数据

    https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...

  5. python3+requests:post请求四种传送正文方式

    https://www.cnblogs.com/insane-Mr-Li/p/9145152.html 前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要 ...

  6. Vue 封装axios(四种请求)及相关介绍(十三)

    Vue 封装axios(四种请求)及相关介绍 首先axios是基于promise的http库 promise是什么? 1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执行,返回符合预期的 ...

  7. HttpwebClient的四种请求方式

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.      本文旨在发布代码,供自己参考,也供大家参考,谢谢. 正题: Ht ...

  8. SpringMVC的REST风格的四种请求方式

    一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ·它们分别对应四种基本操作: 1.GET  ====== 获 取资源 2.POST ======新建资源 ...

  9. httpClient Post例子,Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete

    httpclient post方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //----1. HttpPost request = new HttpPost(ur ...

随机推荐

  1. tensorflow显存管理

    在运行上面的blog的Tensorflow小程序的时候程序我们会遇到一个问题,当然这个问题不影响我们实际的结果计算,但是会给同样使用这台计算机的人带来麻烦,程序会自动调用所有能调用到的资源,并且全占满 ...

  2. iostat使用

    iostat -k 查看io的iowait值是否高 iotop 查看具体是哪个组件在占用io. iostat -x -x代表显示一些扩展参数. %util:一秒中有百分之多少的时间用于 I/O 操作, ...

  3. Yosemite安装libv8和therubyracer

    yosemite ruby version升级的时候,会碰到类似 Make sure that `gem install libv8 -v '3.16.14.3'` succeeds before b ...

  4. Python实现在给定整数序列中找到和为100的所有数字组合

    摘要:  使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度:  初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...

  5. Python: 去掉字符串开头、结尾或者中间不想要的字符

    ①Strip()方法用于删除开始或结尾的字符.lstrip()|rstirp()分别从左右执行删除操作.默认情况下会删除空白或者换行符,也可以指定其他字符. ②如果想处理中间的空格,需要求助其他技术 ...

  6. 阿里云运维部署工具AppDeploy详细教程

    AppDeploy是一个通过SSH实现的命令行工具,可完成应用部署和远程运维管理.当前工具实现为两个版本:普通版(伪代码描述语言)和Python版.Python版使用Python语法规则,可实现您的各 ...

  7. 高并发下,php使用uniqid函数生成唯一标识符的四种方案

    PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方案是结 ...

  8. PHP安装Xdebug扩展并配置PHPstorm调试(Centos、Windows)

    一.给PHP安装Xdebug扩展 [windows] 废话不多说,直接上代码上方法安装扩展,我这里是在windows下. 首先需要确定的就是对应的PHP版本安装对应的Xdebug扩展文件,提供一个最快 ...

  9. 20145321 《网络对抗》 Web基础

    20145321 <网络对抗> Web基础 基础问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能,一个表单有三个基本组成部分:表单标签——这里面包含了处理表单数据所用CGI程序 ...

  10. soapUi在调用过程中日期参数

    中间加个T 2012-11-05T16:38:30 相关描述: