在HTTP协议中,与get请求把请求参数直接放在url中不同,post请求的请求数据需通过消息主体(request body)中传递。
且协议中并没有规定post请求的请求数据必须使用什么样的编码方式,所以其请求数据可以有不同的编码方式,服务端通过请求头中的 Content-Type 字段来获知请求中的消息主体是何种编码方式,再以对应方式对消息主体进行解析。
post请求参数常用的编码方式如下:
- application/x-www-form-urlencoded # form表单格式,非常常见
- multipart/form-data # 一般用于上传文件,较为常见
- application/json # json字符串格式,非常常见
- text/xml # xml格式
关于post请求参数,后面会有文章专门讲述,这里不做过多的阐述。
在这我准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,这份测试文档资料也打包在里面啦,免费领取!
软件测试视频教程观看处:
京东内部员工自动化测试培训课程!盲目自学真的会毁终生,27天学完,能救一个是一个...
使用requests库提供的post方法发送post请求,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
` object - :rtype: requests.Response
- """
-
- return request('post', url, data=data, json=json, **kwargs)
参数说明:
post接口中常用的编码格式在python脚本中对应的请求参数的格式一般就是 dict (字典) 或 json,如 application/x-www-form-urlencoded 格式在python中对应为dict,application/json 在python中对应为json。
因此,接下来分别这种编码格式进行举例。
我们以请求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()
运行结果如下:
由打印出来的返回内容,我们可以判断该接口请求成功。
这里我用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 json
-
- headers = {"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请求参数的格式,且听下回详解。
最后,当你想踏入这个行业,给两点小小的建议:
(1)你自己需要考虑清楚,你是否真的喜欢这个行业,起码有足够的热情愿意去钻研?因为IT行业的技术发展非常快,非常不断地学习才能保证在这个行业长久的走下去。如果不喜欢学习新技术,即便进入这个行业,也会很快被淘汰。
(2)互联网行业的高薪资并不会无缘无故地给你,加班是不可避免的事情,需要自己想清楚能否接受这种工作强度。
如果你给出的答案是肯定的话,那么不用再犹豫不决,坚定的走下去,在这个行业在这个岗位,付出定能得到对应的回报。
PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。