Python接口自动化-requests模块之post请求
源码解析
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) |
post请求参数解析:
-
url: 请求的url,必填;
-
data: 选填,请求参数;
-
json: 选填,请求参数;
-
kwargs:选填,可以传入headers、cookies等。
data、json区别
小伙伴们看完可能有点懵逼,data和json有啥区别呀,什么时候传入data,什么时候传入json。
举个栗子:
1 2 3 4 | data = { "name" : "vivi" } print ( type (data)) |
聪明的小伙伴立即抢答了,打印的是字典类型。
那如果想把字典转换为json字符串呢,需要引用json模块。
1 2 3 4 5 6 | import json data = { "name" : "vivi" } data = json.dumps(data) print ( type (data)) |
敲黑板:
-
不管json是str还是dict,如果不指定headers中的content-type,默认为application/json;
-
data为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式;
-
data为str时,如果不指定content-type,默认为application/json。
重点来了,post请求参数到底是传data还是json,这时候我们要看请求头里的content-type类型(具体参照接口文档,没有接口文档的抓包)。
如果请求头中content-type为application/json, 为json形式,post请求使用json参数。
如果请求头中content-type为application/x-www-form-urlencoded,为表单形式,post请求时使用使用data参数。
form形式发送post请求
当前接口的请求类型为application/x-www-form-urlencoded。
1 2 3 4 5 6 7 8 9 10 11 12 | # 导入requests模块 import requests # 请求url url = "http://127.0.0.1:8000/user/login" # 请求参数 payload = { "mobilephone" : "1530272****" , "pwd" : "123456" } # form表单形式,参数用data res = requests.post(url, data = payload) print (res.text) |
响应结果为:
1 2 3 4 5 6 | { "status" : 1 , "code" : "10001" , "data" : null, "msg" : "登录成功" } |
json形式发送post请求
当前接口的请求类型为application/json。
1 2 3 4 5 6 7 8 9 10 11 | # 导入requests模块 import requests # 请求的url地址 url = 'http://127.0.0.1:8000/user/login/' # 请求头 headers = { "content-type" : "application/json" } # payload 为传入的参数 payload = { "username" : "vivi" , "password" : "123456" , "remember_me" : "false" } # json形式,参数用json res = requests.post(url,json = payload,headers = headers) print (res.text) |
响应结果为:
1 2 3 4 5 | { "token" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY1OTUyOTEsImVtYWlsIjoidml2aUBxcS5jb20ifQ.1RGrO6hSWHi9RDXjYuqY0UCPKMmQvaybpHvYqC0dCis" , "user_id" : 1 , "username" : "vivi" } |
问题来了,如果请求类型为application/json,我偏要传入data参数呢?
先按我们正常思维走一波:
1 2 3 4 5 6 | import requests payload = { "username" : "vivi" , "password" : "123456" , "remember_me" : "false" } header = { "content-type" : "application/json" } url = 'http://127.0.0.1:8000/user/login/' res = requests.post(url,data = payload,headers = header) print (res.text) |
响应结果:请求错误
1 | { "code" : 400 , "data" :[], "message" : "Input error" } |
请求类型为application/json,如果想用data传参,需要将字典类型数据转换为json字符串。
1 2 3 4 5 6 7 8 9 | import requests import json payload = { "username" : "vivi" , "password" : "123456" , "remember_me" : "false" } header = { "content-type" : "application/json" } # 字典转换为json串 data = json.dumps(payload) url = 'http://127.0.0.1:8000/user/login/' res = requests.post(url,data = data,headers = header) print (res.text) |
总结:本文主要讲解post源码,data、json参数应用场景及实战。接口使用的本地服务,如果大家想练手,可以使用公司项目或网上项目自行实战。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2018-11-14 文件上传常见问题整理
2017-11-14 Markdown调查
2016-11-14 弹性布局学习-介绍(一)