我最近在搞一个前后端分离的项目,昨天刚刚搭好了环境,之后在浏览器上测试是可以运行的。由于前端利用小程序的界面,后台提供服务的api之后,小程序只需要向后端发起请求,后台返回json数据串,然后小程序端解析之后提供下一步的操作。
前端用小程序来写,后台利用java 框架。现在由于项目刚刚开始,后台已经写好了一个验证服务。现在利用小程序端发起验证:
wx.request({
url: 'http://xxxxxxxxxx', //仅为示例,并非真实的接口地址
data: {
studentNumber: studentId,
studentName: studentName
},
header: {
'content-type': 'application/json' // 默认值
},
success(res) {
console.log(res.data)
}
})
由于在浏览器端测试都是好的,所以就在小程序开发文档中查阅了请求服务的api,拉下文档中的demo改一改参数作为自己的请求服务代码。本想着应该是成功的,但一直都显示用户名或密码错误的提示(前提是学号和姓名都是正确的,也与数据库进行了比对),搞不清问题,然后就让把传的参数通过后台携带返回。错误结果如下:
请看data返回的结果,就是说小程序发送给后台参数时,传给后台的文本参数时乱码的。查阅了文档之后,感觉可能是header字段中的‘content-type’有点问题,修改默认的‘application/json’为‘application/x-www-form-urlencoded‘之后,问题还是没能解决。然后靠着度娘搜索了很多,也得到了许多的解决方案,一一尝试之后,可以看到问题还是没有解决。网上所给的解决方案有给‘content-type’后面加上‘charset=utf-8’或者修改tomcat的配置文件等等,而后都未果!
后来找到一种说法就是在发送文本参数时编码,然后在后台解码。这一种说法似乎点醒了我,我就搜索了小程序端的编码方式。于是乎代码就改为了:
wx.request({
url: 'http://xxxxxxxxx', //仅为示例,并非真实的接口地址
data: {
studentNumber: studentId,
studentName: encodeURI(studentName)
},
header: {
'content-type': 'application/json' // 默认值
},
success(res) {
console.log(res.data)
}
})
然后后台需要对接收到的参数进行解码,后台解码代码为
String temp = request.getParameter("studentName");
studentName = java.net.URLDecoder.decode(temp,"UTF-8");
运行后成功解决这个问题,于是后台传回了登录成功的结果!
找了好几个小时的原因,终于把这个问题算是解决了,因此在此记录一下过程,如果你也遇到了这个问题,可以参考我的这个解决方案,如果你的问题并没有解决,可以在下方留言讨论。