今天在寫接口的時候發現一個問題,我用apiaaz測試一切正常,但是從小程序接口請求驗證碼,一直驗證失敗。
最開始用的圖形驗證碼,查閱了不少資料,最后懷疑是cookie的問題,解決無果,換成了短信驗證碼
換成短信驗證碼之后,我用apiaaz測試一切正常,小程序請求的時候還是不正常,確定了驗證碼無誤之后
我在控制器里把所有的參數都打印出來,以及session,然后發現session為Null,我又用apiaaz測試了一下
可以登陸,那為什么我可以登陸,小程序不行呢?又查閱了資料,終於找到了答案
普通的Web開發,都是把sessionid保存在cookie中傳遞的。
不管是java還是php,服務端的會在response的header中加上Set-Cookie
Response Headers Content-Type:application/json;charset=UTF-8 Date:Mon, 02 Apr 2018 16:02:42 GMT Set-Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly
瀏覽器的請求也會在header中加上
Request Headers Accept:*/* Accept-Encoding:gzip, deflate, br Accept-Language:zh-CN,zh;q=0.8 Cache-Control:no-cache Connection:keep-alive Content-Length:564 content-type:application/json Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly
通過這個sessionid就能使瀏覽器端和服務端保持會話,使瀏覽器端保持登錄狀態
但是,微信小程序不能保存Cookie,導致每次wx.request到服務端都會創建一個新的會話,小程序端就不能保持登錄狀態了
一個比較簡單的辦法就是在小程序端把cookie保存到storage里,后續請求的時候再讀storage,把cookie添加到請求頭里,這樣做的好處就是,服務端不用做任何改動
具體操作如下:
1、在小程序里把服務端response的Set-Cookie中的值保存到Storage中
wx.request({ url: path, method:method, header: header, data:data, success:function(res){ if(res && res.header && res.header['Set-Cookie']){ wx.setStorageSync('cookieKey', res.header['Set-Cookie']);//保存Cookie到Storage } }, fail:fail })
2、wx.request再從Storage中取出Cookie,封裝到header中
let cookie = wx.getStorageSync('cookieKey'); let path=conf.baseurl+url; let header = { }; if(cookie){ header.Cookie=cookie; } wx.request({ url: path, method:method, header: header, data:data, success:success, fail:fail })
寫法可能不太相同,但是重要的是思路,就是需要小程序端獲取Set-Cookie中的值,在請求的時候攜帶在header中,這樣就能保持會話啦。
