Python+request:根据四种不同的提交数据方式进行post请求


前言

不同于get请求,post请求提交数据方式相对较多,那么如何根据不同的提交数据方式来进行post请求呢?


一、post的四种提交数据方式?

1.application/x-www-form-urlencoded

浏览器的原生form表单
在这里插入图片描述

2.multipart/form-data

基于post方法传递数据,特色:请求头与请求体之间有boundary分割线
【图解】:利用fiddler进行接口测试:选择post,请求头中填写Content-Type: multipart/form-data后点击“Upload file…”,这里我选择上传的是一个图片(我选择的是png格式)。选择完成后,自动生成了边界线(见上图红色框部分)

3.json

不解释在这里插入图片描述

4.binary

二进制文件

二、python+requests实现post请求

如何实现是我们比较关注的,下面对四种请求参数意义举例分析(这里按照日常使用频率从高到低分析)

1.requests.post(参数1,参数2,…)方法源码分析

分析之前,我们先看一下,requests库中关于post方法的源码

def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
        object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    return request('post', url, data=data, json=json, **kwargs)

源码分析:这里我们暂时只关注参数data和json,两者都是进行post请求时要提交的数据,区别在于当数据提交的格式为json时,选用参数为json

2.json格式

以json格式提交数据来进行post进行请是我们平时用的比较多的(需掌握)
代码如下(示例):

import requests
url = "http://127.0.0.1:8000/api/departments/"
# data为请求参数(json格式)
data =  {
                "data": [
                        {
                            "dep_id":"T01",
                            "dep_name":"Test学院",
                            "master_name":"Test-Master",
                            "slogan":"Here is Slogan"
                        }
                  ]
            }
response = requests.post(url,json=data)
print(response.text)

结果展示:
(因为我已经添加过部门T01了,所以结果有already_exist这一项)

{"already_exist":{"count":1,"results":[{"dep_id":"T01","dep_name":"Test学院","master_name":"Test-Master","slogan":"Here is Slogan"}]},"create_success":{"count":0,"results":[]}}

进程已结束,退出代码 0

3.application/x-www-form-urlencoded格式

这种格式使用也较多(需掌握)

代码如下(示例):

import requests
url = "http://httpbin.org/post"
# 请求参数为x-www-form-urlencode格式
data = {
    "username":"ljxsj",
    "password":"123456",
    "hobby":"the piano"
}
response = requests.post(url,data=data)
print(response.text)

这里的请求参数选择的就是data了

结果展示:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "hobby": "the piano", 
    "password": "123456", 
    "username": "ljxsj"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "46", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.24.0", 
    "X-Amzn-Trace-Id": "Root=1-5fbcb875-6f58e6f26b20345a6783528b"
  }, 
  "json": null, 
  "origin": "222.85.145.41", 
  "url": "http://httpbin.org/post"
}


进程已结束,退出代码 0

4.multipart/form-data格式

从上面的分析中可以得知,以form-data格式提交数据时有边界线,用requests库实现post与上面两种方式有所不同,以下

4.1实现步骤

前提:需安装requests-toolbelt(pip install requests-toolbelt)

# 1.导包
  导入requests以及MultipartEncoder包
# 2.添加请求头和加工请求参数
# 3.发送请求

4.2代码实现及结果展示

代码如下(示例):

import requests
from requests_toolbelt import MultipartEncoder

url = "http://httpbin.org/post"
# 请求参数为form-data格式
data = {
    "username": "ljxsj",
    "password": "123456",
    "hobby": "the piano"
}  # 字典格式
# 添加请求头和加工请求参数
# 加工请求参数--让每个请求参数都带有边界
m = MultipartEncoder(fields=data)
# 添加请求头
headers = {"Content_Type": m.content_type}
# 发送请求
response = requests.post(url=url,data=data,headers=headers)
print(response.text)

结果展示:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "hobby": "the piano", 
    "password": "123456", 
    "username": "ljxsj"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "46", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.24.0", 
    "X-Amzn-Trace-Id": "Root=1-5fbcbde8-60739e662a6528ef5f85062d"
  }, 
  "json": null, 
  "origin": "222.85.145.41", 
  "url": "http://httpbin.org/post"
}


进程已结束,退出代码 0

5.binary格式

以binary格式进行数据提交时,我将数据放在一个文件中,这里我放在了一个txt文件中,数据如下:
在这里插入图片描述
代码如下(示例):

import requests
url = "http://httpbin.org/post"
# 打开存放请求数据的文件
files = {"files":open("test.txt","rb")} # 字典格式

response = requests.post(url=url,files=files)
print(response.text)

结果展示:

{
  "args": {}, 
  "data": "", 
  "files": {
    "files": "username:ljx\r\npassword:123456\r\nhobby:just_play\r\n"
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "193", 
    "Content-Type": "multipart/form-data; boundary=db151e7d35bf94cfe08904e91a901ee3", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.24.0", 
    "X-Amzn-Trace-Id": "Root=1-5fbcbf68-183459bc1e7d21bc6c2c1af1"
  }, 
  "json": null, 
  "origin": "222.85.145.41", 
  "url": "http://httpbin.org/post"
}


进程已结束,退出代码 0

总结

本人小白一枚,如有错误,还请指出,谢谢~
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Pythonrequests库是一个常用的发送HTTP请求的工具库。可以使用不同请求方式发送请求,如get、post、delete、put等。可以通过传递请求参数,包括params、data和headers等来定制请求。 对于get请求,可以使用params参数传递查询字符串参数。例如: ```python import requests url = 'http://testingedu.com.cn:8000/index.php' data = { 'username': '13800138006', 'password': '123456', 'verify_code': 'nkpv' } response = requests.get(url=url, params=data) print(response.text) ``` 对于post请求,可以使用data参数传递表单参数。例如: ```python import requests url = 'http://testingedu.com.cn:8000/index.php' data = { 'username': '13800138006', 'password': '123456', 'verify_code': 'nkpv' } response = requests.post(url=url, data=data) print(response.text) ``` 还可以使用headers参数添加请求头参数,例如添加Content-Type为application/json的请求头: ```python import requests url = 'http://testingedu.com.cn:8000/index.php' headers = { 'Content-Type': 'application/json' } response = requests.get(url, headers=headers) ``` 请求的响应内容可以通过rep.text、rep.content、rep.json()等来获取,其中rep.text返回字符串的数据,rep.content返回字节格式的数据,rep.json()返回字典格式的数据。还可以通过rep.status_code获取状态码,rep.reason获取状态信息,rep.cookies获取cookie信息,rep.encoding获取编码格式,rep.headers获取响应头。 对于鉴权,可以通过cookie来实现。具体实现方式可以根据具体的需求进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值