起因
按照接口文檔要求,此次請求需要攜帶cookie,老是請求失敗。有時候在瀏覽器上先把請求地址跑一遍,到小程序上請求又能請求成功了,但一會又失效了,變成了靈異事件,還以為是后台的問題,但是瀏覽器和postman都能直接跑通,說明服務器沒問題。
現在把遇到的幾個坑重頭記錄下,還是自己對帶cookie的請求理解不深和項目文檔沒寫清楚應該問后端。
手動添加完請求頭后,測試請求失敗,在Chrome開發者工具里network選項卡里檢查下這次的請求的格式是否正確。
export default (url, data = {}, method = 'GET') => {
return new Promise((resolve, reject) => {
// 1.初始化promise狀態為pending
// 2.執行異步任務
wx.request({
url: config.host + url,
data,
method,
header: {
// 請求頭添加cookie字段
'cookie': wx.getStorageSync('cookies')
},
// 3.根據異步任務的結果修改promise的狀態
success: (res) => {
// 登錄成功請求,將用戶cookine字段保存至本地
if (data.isLogin) {
wx.setStorageSync('cookies', res.cookies)
}
console.log(res, 'request42行');
// 修改promise狀態為成功resolve
resolve(res.data)
},
fail: (err) => {
console.log('請求失敗', err);
// 修改promise狀態 為成功reject
reject(err)
}
})
})
}
檢查cookie字段並進行測試
檢查storage是否儲存到了cookies,發現是個數組
請求失敗了,一看請求頭攜帶的cookie字段,cookie: [object Array],cookie明顯被處理過了。
判斷格式cookie(顯然請求頭中cookie不可能是數組)不對,然后數據被調用了Object.prototype.toString.apply(cookies)
將cookie處理為字符串后,果然不觸發Object.prototype.toString.apply()了,但是請求仍然失敗
然后用瀏覽器跑了遍接口,對應的在微信小程序對應的接口又能跑通了。打開了瀏覽器的cookie查看,明顯格式和上面在小程序顯示cookie字段不一樣
思考:這里瀏覽器直接就能跑通是因為cookie攜帶成功,但是小程序的cookie需要手動添加cookie字段。所以很明顯問題是添加的時候出現了問題。
同時靈異事件也解釋通了,是因為在用瀏覽器在對應的接口跑通了驗證了cookie所以,你回到微信小程序可以直接訪問。
思考
解決思路:肯定是要按照瀏覽器的cookie字段更改。
思考:登錄時,我們從響應體拿到了這么多cookie字段,而瀏覽器cookie就存儲四個字段。所以解決辦法顯而易見,逐一測試哪個一個字段才是我們此次請求需要添加的字段。
經過測試瀏覽器上四個字段中的一個,鍵名為MUSIC_U 的字段才是我們此次請求需要的字段
解決方法
首先需要對請求頭中拿到的cookies數組中的某一項,找到帶'MUSIC_U'字段
然后判斷本地cookies已經返回,如果沒有,直接取空串。終於成功了。
總結
1.cookie是文本,所以只能是字符串。若拿到后端返回的cookie格式不對時一定要處理
2.面對多個cookie字段時,應該搞清楚每個字段的作用。多和后端溝通。而不是自己一個一個猜浪費時間。