参数说明:


1. url,请求网址
2. data,字典、元组列表、字节或要发送到指定URL的文件对象,可选(即可填可不填)
3. json,要发送到指定URL的JSON对象,可选
4. \*\*kwargs,可以添加其他请求参数,如headers、timeout、cookies等


**post接口中常用的编码格式在python脚本中对应的请求参数的格式一般就是 dict (字典) 或 json**,如 application/x-www-form-urlencoded 格式在python中对应为dict,application/json 在python中对应为json。


因此,接下来分别这种编码格式进行举例。


#### 发送post请求(请求参数格式为dict)


我们以请求TesterHome网的登录接口为例,发送请求参数格式为dict的请求。


请求头中content-type为`application/x-www-form-urlencoded;charset=UTF-8`,如下图所示:



那么请求参数编码格式应为dict,代码如下:
import requests
def testerhome_login():
 # data为请求入参
 data = {
 “user[login]”: “账号”,
 “user[password]”: “密码”,
 “user[remember_me]”: 0,
 “commit”: “登录”
 }
 headers = {
 “user-agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53
 7.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36”
 }
 url = “https://testerhome.com/account/sign_in”# 编码格式为application/x-www-form-urlencoded;charset=UTF-8,所以请求参数为dict,使用data参数
res = requests.post(url=url, headers=headers, data=data)
print(res.text)
print(res.status_code)if name == ‘main’:
 testerhome_login()运行结果如下:



由打印出来的返回内容,我们可以判断该接口请求成功。


#### 发送post请求(请求参数格式为json)


这里我用flask框架写了个简单的模拟接口来演示,接口代码如下:from flask import Flask, jsonify, request
app = Flask(name)
 app.config[“JSON_AS_ASCII”] = False@app.route(“/login”, methods=[“POST”])
 def login():
 username = request.json.get(“username”).strip()
 password = request.json.get(“password”).strip()
 print(username, password)
 if username and password:
 if username == “lilei” and password == “123456”:
 return jsonify(
 {“code”: 1000, “msg”: “登录成功!”, “token”: “sh34ljjl08s32730dj”}
 )
 elif username == “hanmeimei” and password == “888888”:
 return jsonify(
 {“code”: 1000, “msg”: “登录成功!”, “token”: “hjf078977l08ert2323k”}
 )
 else:
 return jsonify(
 {“code”: 1001, “msg”: “账号或密码错误!”}
 )
 else:
 return jsonify(
 {“code”: 1002, “msg”: “账号或密码不能为空!”}
 )if name == ‘main’:
 app.run()注意需要先安装flask框架,然后运行该模块,具体可参考我之前的文章[使用Flask开发简单接口]( ),运行后我们可以看到该接口服务的 host 地址,如下:



这个接口的请求参数格式需要为json,requests.post()请求这个接口代码如下:import requests
 import jsonheaders = {“Content-Type”: “application/json;charset=utf8”}
 url = “http://127.0.0.1:5000/login”
 _data = {
 “username”: “lilei”,
 “password”: “123456”
 }这里使用json参数,即json=_data
res = requests.post(url=url, headers=headers, json=_data).text
当然还可以使用data参数,但需先将_data转换为json格式,即data=json.dumps(_data)
json.dumps()将dict格式转换成json格式
res = requests.post(url=url, headers=headers, data=json.dumps(_data)).text
 print(res)
运行结果如下:


#### 总结

post请求因为请求主体编码格式的原因,在使用 requests.post() 时需要根据接口请求头中Content-Type字段,为请求参数选择指定的编码格式,才能发送请求。其实get请求的请求参数也有其对应的编码格式,至于如何确定get、post请求参数的格式,且听下回详解。