Post请求的四种方式

2023-11-17

Post请求四种传送方式的Python实现

HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。常见的四种编码方式如下:

♦1、application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST http://www.example.com HTTP/1.1    Content-Type:
application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

​ ♦2、multipart/form-data

除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。
  这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值,下面是示例

接下来我们就来说一下post请求四种传送正文方式:

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

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

♦4、text/xml
  它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。

post请求四种传送正文方式:

(1)请求正文是application/x-www-form-urlencoded

(2)请求正文是multipart/form-data

(3)请求正文是raw

(4)请求正文是binary

(1)请求正文是application/x-www-form-urlencoded

形式:

1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'application/x-www-form-urlencoded'})

♦Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

输入:

url = 'http://httpbin.org/post'
d = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=d)
print r.text

输出:

{ 
“args”: {}, 
“data”: “”, 
“files”: {}, 
“form”: { 
“key1”: “value1”, 
“key2”: “value2” 
}, 
“headers”: { 
…… 
“Content-Type”: “application/x-www-form-urlencoded”, 
…… 
}, 
“json”: null, 
…… 
}

♦可以看到,请求头中的Content-Type字段已设置为application/x-www-form-urlencoded,且d = {'key1': 'value1', 'key2': 'value2'}以form表单的形式提交到服务端,服务端返回的form字段即是提交的数据。

(2)请求正文是multipart/form-data

除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。

形式:

1 requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'multipart/form-data'})
♦发送文件中的数据需要(安装requests_toolbelt)
from requests_toolbelt import MultipartEncoder
import requests

m = MultipartEncoder(
    fields={'field0': 'value', 'field1': 'value',
            'field2': ('filename', open('file.py', 'rb'), 'text/plain')}
    )

r = requests.post('http://httpbin.org/post', data=m,
                  headers={'Content-Type': m.content_type})

​ ♦不需要文件

from requests_toolbelt import MultipartEncoder
import requests

m = MultipartEncoder(fields={'field0': 'value', 'field1': 'value'})

r = requests.post('http://httpbin.org/post', data=m,
                  headers={'Content-Type': m.content_type})

(3)请求正文是raw

形式:

♦传入xml格式文本
1 requests.post(url='',data='<?xml  ?>',headers={'Content-Type':'text/xml'})
♦传入json格式文本
1 requests.post(url='',data=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})

或者:

1  requests.post(url='',json={{'key1':'value1','key2':'value2'}},headers={'Content-Type':'application/json'})

♦可以将一json串传给requests.post()的data参数,

输入:

url = 'http://httpbin.org/post'
s = json.dumps({'key1': 'value1', 'key2': 'value2'})
r = requests.post(url, data=s)
print r.text

输出:

{ 
“args”: {}, 
“data”:{\”key2\”: \”value2\”, \”key1\”: \”value1\”}, 
“files”: {}, 
“form”: {}, 
“headers”: { 
…… 
“Content-Type”: “application/json”, 
…… 
}, 
“json”: { 
“key1”: “value1”, 
“key2”: “value2” 
}, 
…… 
}

(4)请求正文是binary

形式:

1 requests.post(url='',files={'file':open('test.xls','rb')},headers={'Content-Type':'binary'})

♦Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files参数即可。

输入:

url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print r.text

输出:

{ 
“args”: {}, 
“data”: “”, 
“files”: {file: “Hello world!” 
}, 
“form”: {}, 
“headers”: {…… 
“Content-Type”: “multipart/form-data; boundary=467e443f4c3d403c8559e2ebd009bf4a, 
…… 
}, 
“json”: null, 
…… 
}

♦文本文件report.txt的内容只有一行:Hello world!,从请求的响应结果可以看到数据已上传到服务端中。

注意:一定要注意headers的类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Post请求的四种方式 的相关文章

  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 如何检索分配给 Django 中的组的所有权限

    我正在执行一项任务来检索分配给 Django 中的组的一组权限 我可以使用以下代码获取创建的组 但无法使用它来获取分配给它们的权限 from django contrib auth models import Group Permissio
  • 如何在seaborn热图标签中使用科学计数法?

    我正在尝试在 python 中使用seaborn 获取热图 不幸的是 即使数字非常大 它也没有使用科学记数法 我想知道是否有任何简单的方法可以转换为科学记数法或任何其他合理的格式 这是显示问题的一段代码 import seaborn as
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 当我从本地计算机更改为虚拟主机时,从 python 脚本调用 pdftotext 不起作用

    我编写了一个小的 python 脚本来解析 提取 PDF 中的信息 我在本地机器上测试了它 我有 python 2 6 2 和 pdftotext 版本 0 12 4 我正在尝试在我的虚拟主机服务器 dreamhost 上运行它 它有 py
  • 样本()和r样本()有什么区别?

    当我从 PyTorch 中的发行版中采样时 两者sample and rsample似乎给出了类似的结果 import torch seaborn as sns x torch distributions Normal torch tens
  • 获取 int() 参数必须是字符串或数字,而不是“Column”- Apache Spark

    如果我使用以下代码 我会收到此异常 int argument must be a string or a number not Column df df withColumn FY F when df ID substr 5 2 isin
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • 同一台机器上有多个Python版本?

    Python 网站上是否有关于如何在 Linux 上的同一台计算机上安装和运行多个版本的 Python 的官方文档 我可以找到无数的博客文章和答案 但我想知道是否有 标准 官方方法可以做到这一点 或者这一切都取决于操作系统 我认为它是完全独
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 如何处理 Tkinter 中的窗口关闭事件?

    如何在 Python Tkinter 程序中处理窗口关闭事件 用户单击 X 按钮 Tkinter 支持一种称为协议处理程序 http web archive org web 20201111215134 http effbot org tk
  • 有没有办法拉伸整个显示图像以适应给定的分辨率?

    我最近一直在使用pygame制作游戏 遇到了一个小问题 基本上 我希望能够将屏幕上的整个图像 我已经传输到它的所有内容 拉伸到用户将窗口大小调整到的分辨率 我在 pygame 和堆栈溢出的文档中搜索了很多 但我似乎找不到答案 这可能吗 我的
  • 避免“散点/点/蜂群”图中的数据点重叠

    使用绘制点图时matplotlib 我想偏移重叠的数据点以使它们全部可见 例如 如果我有 CategoryA 0 0 3 0 5 CategoryB 5 10 5 5 10 我想要每一个CategoryA 0 数据点并排设置 而不是彼此重叠
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d

随机推荐

  • 计数排序基础思路

    所谓计数排序 也可以称为散列表 也是一种简单的哈希桶 今天 小编带大家来了解计数排序的基本思路 一 基本思路 以升序为例 计数排序通俗来讲 分为三个步骤 首先制作包含所有要排序的数的桶 相同的数制作一个桶即可 以2 3 6 1 4 1 2
  • eclipse如何配置Maven

    Maven 翻译为 专家 内行 是 Apache 下的一个纯 Java 开发的开源项目 基于项目对象模型 缩写 POM 概念 Maven利用一个中央信息片断能管理一个项目的构建 报告和文档等步骤 Maven 是一个项目管理工具 可以对 Ja
  • C++:unique_ptr

    Code C program to illustrate the use of unique ptr include
  • Go_一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP

    网络编程三要素 ip地址 端口 协议 在网络通信协议下 不同计算机上运行的程序 可以进行数据传输 IP地址 IP地址是一种在互联网协议中用于识别和定位设备的32位或128位数字地址 它是一个设备在网络上的唯一标识符 用于在互联网上定位和识别
  • 【房价网房价信息爬虫】整站40万条房价数据并行抓取,可更换抓取城市

    写在前面 学习数据采集 先转载下来 之后在学习 这次的爬虫是关于房价信息的抓取 目的在于练习10万以上的数据处理及整站式抓取 数据量的提升最直观的感觉便是对函数逻辑要求的提高 针对Python的特性 谨慎的选择数据结构 以往小数据量的抓取
  • git fetch merge rebase squash

    合并分类 在合并分支的时候 默认是有三种选项的 分别是 普通的 merge squash merge rebase merge 区分 merge 和 rebase 更多参考GIT使用rebase和merge的正确姿势 准备 假设我们有如下图
  • Java异常 (throwable)

    异常主要是error和exception两种 throwable的两个子类 1 Error类及其子类 代表的是Error类及其子类 代表的是jvm本身的错误 错误不能被程序通过代码处理 2 Exception类及其子类 一般都是程序写错了
  • 韦东山和正点原子IMX6ULL开发版的区别

    网卡驱动复位引脚硬件区别 网卡 复位脚 厂家 io 网卡0 SNVS TAMPER9 100ask gpio5 IO9 网卡1 SNVS TAMPER6 100ask gpio5 IO6 网卡0 SNVS TAMPER7 正点原子 gpio
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • 布局-ConstrainLayout

    Relative positioning 相对位置 layout constraintLeft toLeftOf 将所需视图的左边与另一个视图的左边对齐 layout constraintLeft toRightOf 将所需视图的左边与另一
  • Vue中使用TailwindCSS实现深色模式(跟随系统和手动控制)

    Vue中使用TailwindCSS实现深色模式 跟随系统和手动控制 源码下载 先贴一下手动控制的成品效果 创建VUE工程 初始化 Tailwind CSS 安装 Tailwind 以及其它依赖项 创建配置文件 在 CSS 中引入 Tailw
  • 174万亿采购,奔向数字化

    采购不单纯发生在外部 更发生在内部 只有两者同时进行 才能完成采购中心从成本到利润中心角色的转变 作者 斗斗 编辑 皮爷 出品 产业家 数字化 让很多企业业务流程发生了质变 2022数字化采购发展报告 显示 数字化采购的价值可降低30 供应
  • 基于java的小区车辆管理系统

    本系统主要采用JSP为编程语言 可以方便管理小区车辆管理需要 后台主要包括车辆管理 停车卡管理 车位管理等功能 本系统操作简单 使用方便 本系统旨在为小区物业管理人员提供一个功能齐全 使用方便的基于卡式的小区车辆管理系统 以代替传统的人员管
  • C#—DataTable常见用法

    1 构建DataTable数据源 DataTable dt new new DataTable dt new Columns Add column1 typeof string dt new Columns Add column2 type
  • check original full command

    suppose I create a shortcut command named sql how can I know its original full command xxx 1014 type sql sql is hashed a
  • 【centos8.2下载安装netcat监听工具】——关注紫灵小姐姐不踩坑

    下载 wget https sourceforge net projects netcat files netcat 0 7 1 netcat 0 7 1 tar gz 解压 安装 cd netcat 0 7 1 configure 如果报
  • 数据库 练习(五)

    创建student表 CREATE TABLE Student S VARCHAR 10 Sname VARCHAR 10 Sage DATETIME Ssex NVARCHAR 10 创建数据 INSERT INTO Student VA
  • typora使用教程

    typora使用教程 1 多级标题的使用 加空格 表示一级标题 加空格 表示二级标题 加空格 表示三级标题 加空格 表示四级标题 typora最多支持六级标题 2 有序列表和无序列表的使用 或 加空格 会生成无序列表 如下 这是 加空格生成
  • 【你哥电力电子】THE BOOST 升压斩波电路1

    BOOST电路1 2023年1月12日 nige in Tongji University elecEngeneer 上链 文章目录 BOOST电路1 1 BOOST电路来源 2 CCM下的理想稳态分析 2 1 分析流程 3 DCM下的理想
  • Post请求的四种方式

    Post请求四种传送方式的Python实现 HTTP 协议规定 POST 提交的数据必须放在消息主体 entity body 中 但协议并没有规定数据必须使用什么编码方式 常见的四种编码方式如下 1 application x www fo