1. 程式人生 > 其它 >【微信小程式】微信小程式請求頭手頭新增cookie 注意事項。

【微信小程式】微信小程式請求頭手頭新增cookie 注意事項。

起因

按照介面文件要求,此次請求需要攜帶cookie,老是請求失敗。有時候在瀏覽器上先把請求地址跑一遍,到小程式上請求又能請求成功了,但一會又失效了,變成了靈異事件,還以為是後臺的問題,但是瀏覽器能直接跑通,說明伺服器沒問題。

現在把遇到的幾個坑重頭記錄下,還是自己對帶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已經返回,如果沒有,直接取空串。終於成功了。



總結