post请求四种传送正文的方式
一、简介
HTTP协议规定post提交的数据必须放在消息主体(entity-body)中,但协议没有规定数据必须使用什么编码方式。HTTP协议是以ASCII码传输,建立再TCP/IP协议之上的应用层规范。HTTP请求分为3个部分:状态行、请求头和消息主体。类似于:
<method> <request-URL> <version> <headers> <entity-body>
服务端通常是根据请求头(header)中的Content_Type字段来获取请求中的消息主体是用何种方式编码,再对消息主体进行解析。
二、浏览器form表单提交
1.form表单常用属性如下:
action:url 地址,服务器接收表单数据的地址
method:提交服务器的http方法,一般为post和get
name:
enctype: 表单数据提交时使用的编码类型,默认使用"application/x-www-form-urlencoded",如果是使用POST请求,则请求头中的content-type指定值就是该值。如果表单中有上传文件,编码类型需要使用"multipart/form-data",类型,才能完成传递文件数据。
PS:enctype为form表单数据的编码格式,Content-type为HTTP传输的数据的编码格式,要分清两者!!!
2.浏览器提交表单时,会执行如下步骤:
① 识别出表单中表单元素的有效项,作为提交项
② 构建一个表单数据集
③ 根据form表单中enctype属性的值作为content-type属性的值作为content-type对数据进行编码
④ 根据form表单中的action属性和method属性向指定的url地址发送数据
3.提交方式的不同
① get:表单数据会被encodeURIComponent后以参数的形式:name1=value1&name2=value2附带在url?后面,再发送给服务器,并在url中显示出来。
② post:enctype默认“application/x-www-form-urlencoded”对表单数据进行编码,数据以键值对在http请求中发送给服务器;如果enctype属性为“multipart/form-data”,则以消息的形式发送给服务器。
三、常见的四种编码方式
1.application/x-www-form-urlencoded
最常见的post提交数据的编码方式。浏览器的原生form表单,若不设置enctype属性,默认以application/x-www-form-urlencoded编码方式提交数据。for example:
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. for example:
<form action="/upload" enctype="multipart/form-data" method="post">
Username: <input type="text" name="username">
Password: <input type="password" name="password">
File: <input type="file" name="file">
<input type="submit">
</form>
3.application/json
4.text/xml
四、post请求四种传送正文方式
1.请求正文是application/x-www-form-urlencoded
形式:requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'multipart/form-data'})
requests支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可
import requests
url = "http://httpbin.org/post"
data = {"key1":"value1","key2":"value2"}
headers = {"Content-type":"application/x-www-form-urlencoded"}
r = requests.post(url=url,data=data,headers=headers)
print(r.text)

由上图可以看到,请求头中的Content-Type字段已设置为application/x-www-form-urlencoded,且data = {'key1': 'value1', 'key2': 'value2'}以form表单的形式提交到服务端,服务端返回的form字段即是提交的数据。
2.请求正文是multipart/form-data
形式:
requests.post(url='',data={'key1':'value1','key2':'value2'},headers={'Content-Type':'multipart/form-data'})
from requests_toolbelt import MultipartEncoder
import requests
url="http://httpbin.org/post"
m = MultipartEncoder(fields={"field0":"value","field1":"value"}) # 删掉fields效果一样
headers = {"Content-Type":m.content_type}
r = requests.post(url=url,data = m,headers=headers)
print(r.text)

3.请求正文是raw
形式:
① 传入xml格式文本(可扩展性语言:Extensible markup language)
requests.post(url='',data='<?xml ?>',headers={'Content-Type':'text/xml'})
② 传入json格式文本
requests.post(url='',data=json.dumps({'key1':'value1','key2':'value2'}),headers={'Content-Type':'application/json'})
或:requests.post(url='',json={{'key1':'value1','key2':'value2'}},headers={'Content-Type':'application/json'})
for example:
import requests
import json
url = "http://httpbin.org/post"
j = {"key1":"value1","key2":"value2"}
data = json.dumps(j) # json模块下的dumps函数将dict转换为str
headers = {"Content-type":"application/json"}
r = requests.post(url=url,data=data,json=j,headers=headers)
print(r.text)
PS:脚本中dumps不要写成dump,否则会报缺失fp(类文件指针)的错误
python中json.dumps()和json.dump()的区别: https://www.cnblogs.com/fengff/p/11008353.html

4.请求正文是binary
形式:
requests.post(url='',files={'file':open('test.xls','rb')},headers={'Content-Type':'binary'})
import requests
url = "http://httpbin.org/post"
files = {"file":open("test.xlsx","rb")}
headers = {"Content-type":"binary"}
r = requests.post(url=url,files=files,headers=headers)
print(r.text)

另外,requests也支持multipart方式发送post请求,只需将一文件传给requests.post()的参数files即可。
import requests
url = "http://httpbin.org/post"
files = {"file":open("report.txt","rb")}
r = requests.post(url=url,files=files)
print(r.text)
PS:为了避免文件路径的问题,建议文件直接放在当前py文件的同一级目录下。

post请求四种传送正文的方式的更多相关文章
- python接口自动化(十)--post请求四种传送正文方式(详解)
简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...
- python3+requests:post请求四种传送正文方式(详解)
前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等,可以参考Get,Post请求方式经典详解进行学习一下. 我 ...
- python3+requests:post请求四种传送正文方式
https://www.cnblogs.com/insane-Mr-Li/p/9145152.html 前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要 ...
- java正则表达式四种常用的处理方式是怎么样呢《匹配、分割、代替、获取》
java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下package test; import java.util.regex.Matcher; import jav ...
- java内部类及四种内部类的实现方式
java内部类及四种内部类的实现方式 一.内部类定义:内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类. 二.为何要内部类?a.内部类提供了某种进入外围类的窗户.b.也是最吸引人的原因, ...
- Spring中四种实例化bean的方式
本文主要介绍四种实例化bean的方式(注入方式) 或者叫依赖对象实例化的四种方式.上面的程序,创建bean 对象,用的是什么方法 ,用的是构造函数的方式 (Spring 可以在构造函数私有化的情况下把 ...
- 8237dma的四种传送方式简介
8237A有四种工作方式:单字节传送.数据块传送.请求传送和多片级联. (1)单字节传送(single mode) 单字节传送方式是每次DMA传送时,仅传送一个字节.传送一个字节之后,当前字节计数器减 ...
- JS原生对象实现异步请求以及JQ的ajax请求四种方式
一.JS原生方式异步请求 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="A ...
- 【Python】Http Post请求四种请求体的Python实现
前言 前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在学习Http请求相关的内容,所以决定总结一下各类Post请求的Python实现. Happy ...
随机推荐
- Django异步任务线程池
当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中完成,发起异步任务的请求就可以立即响应 选择用线程池的原因是:线程比进程更为可控.不 ...
- 【数据结构06】二叉平衡树(AVL树)
目录 一.平衡二叉树定义 二.这货还是不是平衡二叉树? 三.平衡因子 四.如何保持平衡二叉树平衡? 五.平衡二叉树插入节点的四种情况 六.平衡二叉树操作的代码实现 七.AVL树总结 @ 一.平衡二叉树 ...
- 第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、StackOverflow
Netnr.Login 第三方OAuth授权登录 支持第三方登录 三方 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 安装 ( ...
- 不启动AndroidStudio直接启动其模拟器
1.找到自己电脑Android sdk的安装路径下的tools\emulator.exe 2.获取你要启动的模拟器的名称 我这里是Nexus 5X API 27,把名字中间的空格改为_,我这里就应该改 ...
- ELK输出nginx的日志(未完成)
我们先准备3台centos7服务器 171 做 elasticsearch,kibana的操作 172 做logstash 的操作 173 做nginx 的操作 软件 版本号 elasticsearc ...
- 建议2:注意Javascript数据类型的特殊性---(1)防止浮点数溢出
1.防止浮点数溢出 二级制的浮点数不能正确地处理十进制的小数,因此 0.1+0.2不等于0.3 num = 0.1+0.2; //0.30000000000000004 这是JavaScript中经常 ...
- 搞懂toString()与valueOf()的区别
一.toString() 作用:toString()方法返回一个表示改对象的字符串,如果是对象会返回,toString() 返回 “[object type]”,其中type是对象类型. 二.valu ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- 骚年,如果你还不懂一些java常识?中了奖也无法兑换
今天下午约着几个朋友一起去看叶问4,结果碰到了一个有趣的事情,正好和java有关所以写一篇文章来记录一下. 事件:我和朋友小李.小王一起去看电影 时间:2019/12/21 地点:H市某家电影院 起因 ...
- 【Java必修课】图说Stream中的skip()和limit()方法及组合使用
1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...