环境:Windows 7、python3.6
使用 Jeesite 进行开发,因为更改代码后重新启动 Tomcat ,会话丢失会要求重新登录,验证成功后才能进行正常的访问,否则就会重定向到 login 页面。(先忽略掉“记住我”这个选项,主要是练手。。。)
1、首先使用 pip 安装 requests:
pip install requests
安装完成后 cmd 输入:python,进入命令界面:
>> import requests
>> requests.__version__
>> '2.8.14' #输出版本
2、首先进入 Jeesite 登录界面,输入用户名和密码后点击登录,进入首页后进入浏览器调试模式(F12),查看网络一栏:
其中的 Request Headers 是 http 头信息,FormData 是向后台提交的用户数据。
3、开始撸代码:
import requests
import re
def login(baseUrl, userName, password):
login_data = {
'username' : userName,
'password' : password
}
headers_base = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'max-age=0',
'Connection':'keep-alive',
'Content-Length':'31',
'Content-Type':'application/x-www-form-urlencoded',
'Host':'localhost:8080',
'Origin':'http://localhost:8080',
'Referer':'http://localhost:8080/项目名/a/login',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
}
session = requests.session()
content = session.post(baseUrl, headers = headers_base, data = login_data, allow_redirects=False)
s = session.get("接口url", verify = False)
print(s.json())
if __name__ == "__main__":
url = "http://localhost:8080/项目名/a/login"
login(url,"capinfo","admin")
运行脚本文件: python test.py
正常返回了 JSON 数据。
========================================
如果要携带参数,需要上面的代码稍做修改:
s = session.get("接口url", verify = False)
更改为:
s = session.post("接口url", data = {"startYear":"2018","endYear":"2018"}, verify = False)
后台 Java 方法:
开始测试: python test.py
上图的运行并没有正确返回,Tomcat 415 错误:Unsupported Media Type,这个是因为没有定义头信息中的 content-Type,再次更改:
headers_interface = {
'content-Type': 'application/json'
}
s = session.post("接口URL", headers = headers_interface, data = {"startYear":"2018","endYear":"2018"}, verify = False)
更改后再次测试:python test.py
返回了 400 ,将 log4j 的 springframework 的调试级别为 DEBUG:
#Springframework level
log4j.logger.org.springframework=DEBUG
查看输出日志:
Could not read JSON: Unexpected character ('s' (code 115)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
应该是传输的 JSON 数据没有正确的解析,上网查了一下,使用下面的办法:
import json
###
params = {"startYear":"2018","endYear":"2018"}
s = session.post("接口URL", headers = headers_interface, data = json.dumps(params), verify = False)
再次测试,终于正常。
有疑问的是:为什么 data = json.dumps(params) 这种形式正常,而在 post 中直接定义 JSON 却不行。