上篇介绍完发送get请求的接口,你们必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了。答案是对的,虽然发送post请求的参考例子很简单,可是实际遇到的状况倒是很复杂的,由于全部系统或者软件、网站都是从登陆开html
始的,进入这扇门才能够发现里边的奥秘,因此首先介绍的第一个post请求确定是登陆了,但登陆是最难处理的。若是把登陆问题这只拦路虎解决了,那么后面问题都迎刃而解。python
上篇介绍发送get请求的接口时,学习requests模块,是让你们去访问官方网站,查看官方文档;其实学习一个新的模块捷径,不用去百度什么的,直接用 help 函数就能查看相关注释和案例内容。json
上一篇,咱们就见识过requests的强大功能和威力。寥寥几行代码就能够实现get和post的请求。介绍到这里想必大伙都火烧眉毛了,好,那咱们来牛刀小试一下。浏览器
一、用上面给的python发送post请求接口案例,稍稍地作个简单修改,就能够发个简单的post 请求安全
二、即可以像官方文档给出的案例将payload 参数是字典类型(dict),传到以下图的 form 里ide
一、post 的 body 是 json 类型,也能够用 json 参数传入。函数
二、先导入 json 模块,用 dumps 方法转化成 json 格式。工具
三、返回结果,传到 data 里post
如今因为对接口安全性的要求,使得模拟登陆愈来愈复杂,比上边介绍的基本内容要复杂不少。通常来讲登录只要涉及安全性方面考虑,那么登录就会比较复杂。学习
一、以博客园为例,几年前模拟登录,没有涉及安全性考虑相对简单。发展到如今其登陆涉及安全性考虑,因此实际的状况要比上面讲的几个复杂不少,
二、咱们在请求数据时也能够加上自定义的headers(经过headers关键字参数传递)有时候有的特殊的请求必须加上headers头信息,才回返回响应结果。例如:博客园登陆时,将请求头 headers添加上,这里不是说博客园登陆必须登陆才能返回
响应结果,而是以其为例子来讲明将请求头header参数加入到登陆请求接口中。这里能够用抓包工具来看其登陆时的请求头。以下是fiddler工具抓包时登陆的请求头。
三、因为博客园的登陆方式改变了,咱们换一个例子演示。仍是以官方文档给的网址演示以下
(1)抓包,查看其请求头,浏览器F12查看
Fiddler抓包查看请求头,结果以下:
实例代码和其结果:
遇到问题报错和解决办法:
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='httpbin.org', port=443): Max retries exceeded with url: /post (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')])")))
一、因为这里是 https 请求,直接发送请求会报错误:SSLError: HTTPSConnectionPool(host='httpbin.org', port=443): Max retries exceeded with url: /post (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')])")))
二、能够加个参数:verify=False,表示忽略对 SSL 证书的验证,可是此时仍然会有警告:
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
三、这里请求参数 payload 是 json 格式的,用 json 参数传。将请求头写成字典格式,进行传参。
四、最后结果是 json 格式,能够直接用 r.json 返回 json 数据:
{'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'}, 'json': None, 'origin': '222.128.10.95, 222.128.10.95', 'url': 'https://httpbin.org/post'}
五、json参数和dict的参数很是相似,都是key-value的形式,它们有何区别,欲知后事如何,且听下回分解。