遇到一个在新页面中打开第三方网站,但是只提供了POST请求的需求。
首先要吐槽第三方网站只提供POST请求,简直****!
1、接口测试
首先用postman测试接口,返回html文档,第三方接口用POST请求,默认对方返回的是静态页面,将结果写入新窗口即可;代码测试发现该html文档是第三方系统内部访问的页面,有很多该系统内部的请求。
2、解决方案
表单可以用POST请求向第三方网站提交数据,尝试js内部构造form表单,并提交
const url = '{address}/index_new.php/Login';
const tempForm = document.createElement('form');
tempForm.action = url;
tempForm.target = '_blank';
tempForm.method = 'post';
tempForm.style.display = 'none';
for (const x in argument) {
const opt = document.createElement('input');
opt.type = 'hidden';
opt.name = x;
opt.value = argument[x];
tempForm.append(opt);
}
document.body.appendChild(tempForm);
tempForm.submit();
document.body.removeChild(tempForm);
成功打开新窗口,document.domain = {address},但该接口只接受application/json格式参数,表单POST请求参数默认为application/x-www-form-urlencoded。至此发现对方接口不可行,只能和对方沟通修改接口。
对方无论如何不接受提供GET请求,只能要求对方修改该请求参数为application/x-www-form-urlencoded类型。
form提交打开的新窗口,打开控制台,刷新后network窗口可以看到form提交的数据。如百度搜索163,在百度页面输入163邮箱的账号密码登录,form提交跳转到163邮箱登录页面,如果登录失败,即可如此查看;如果登录成功,163返回一个token,做一次重定向,直接跳转到个人邮箱主页。当然,如果抓包,还是能监测到form请求的信息——而且是明文。
因此,考虑到安全因素,尽量与第三方系统在后台完成关键数据的交互,比如使用Author2.0等验证方式,前端持token跳转。