uni-app-網路請求
阿新 • • 發佈:2020-08-27
uni.request(OBJECT)
發起網路請求。
在各個小程式平臺執行時,網路相關的 API 在使用前需要配置域名白名單。
OBJECT 引數說明
引數名 | 型別 | 必填 | 預設值 | 說明 | 平臺差異說明 |
---|---|---|---|---|---|
url | String | 是 | 開發者伺服器介面地址 | ||
data | Object/String/ArrayBuffer | 否 | 請求的引數 | App(自定義元件編譯模式)不支援ArrayBuffer型別 | |
header | Object | 否 | 設定請求的 header,header 中不能設定 Referer。 | H5端會自動帶上cookie不可手動覆蓋 | |
method | String | 否 | GET | 有效值詳見下方說明 | |
timeout | Number | 否 | 30000 | 超時時間,單位 ms | 微信小程式(2.10.0)、支付寶小程式 |
dataType | String | 否 | json | 如果設為 json,會嘗試對返回的資料做一次 JSON.parse | |
responseType | String | 否 | text | 設定響應的資料型別。合法值:text、arraybuffer | App和支付寶小程式不支援 |
sslVerify | Boolean | 否 | true | 驗證 ssl 證書 | 僅App安卓端支援(HBuilderX 2.3.3+) |
withCredentials | Boolean | 否 | false | 跨域請求時是否攜帶憑證(cookies) | 僅H5支援(HBuilderX 2.6.15+) |
firstIpv4 | Boolean | 否 | false | DNS解析時優先使用ipv4 | 僅 App-Android 支援 (HBuilderX 2.8.0+) |
success | Function | 否 | 收到開發者伺服器成功返回的回撥函式 | ||
fail | Function | 否 | 介面呼叫失敗的回撥函式 | ||
complete | Function | 否 | 介面呼叫結束的回撥函式(呼叫成功、失敗都會執行) |
method 有效值
必須大寫,有效值在不同平臺差異說明不同。
method | App | H5 | 微信小程式 | 支付寶小程式 | 百度小程式 | 位元組跳動小程式 |
---|---|---|---|---|---|---|
GET | √ | √ | √ | √ | √ | √ |
POST | √ | √ | √ | √ | √ | √ |
PUT | √ | √ | √ | x | √ | √ |
DELETE | √ | √ | √ | x | √ | x |
CONNECT | √ | √ | √ | x | x | x |
HEAD | √ | √ | √ | x | √ | x |
OPTIONS | √ | √ | √ | x | √ | x |
TRACE | √ | √ | √ | x | x | x |
success 返回引數說明
引數 | 型別 | 說明 |
---|---|---|
data | Object/String/ArrayBuffer | 開發者伺服器返回的資料 |
statusCode | Number | 開發者伺服器返回的 HTTP 狀態碼 |
header | Object | 開發者伺服器返回的 HTTP Response Header |
cookies | Array.<string> |
開發者伺服器返回的 cookies,格式為字串陣列 |
data 資料說明
最終傳送給伺服器的資料是 String 型別,如果傳入的 data 不是 String 型別,會被轉換成 String。轉換規則如下:
- 對於
GET
方法,會將資料轉換為 query string。例如{ name: 'name', age: 18 }
轉換後的結果是name=name&age=18
。 - 對於
POST
方法且header['content-type']
為application/json
的資料,會進行 JSON 序列化。 - 對於
POST
方法且header['content-type']
為application/x-www-form-urlencoded
的資料,會將資料轉換為 query string。
示例
uni.request({
url: 'https://www.example.com/request', //僅為示例,並非真實介面地址。
data: {
text: 'uni.request'
},
header: {
'custom-header': 'hello' //自定義請求頭資訊
},
success: (res) => {
console.log(res.data);
this.text = 'request success';
}
});
返回值
如果希望返回一個requestTask
物件,需要至少傳入 success / fail / complete 引數中的一個。例如:
var requestTask = uni.request({
url: 'https://www.example.com/request', //僅為示例,並非真實介面地址。
complete: ()=> {}
});
requestTask.abort();
如果沒有傳入 success / fail / complete 引數,則會返回封裝後的 Promise 物件:Promise 封裝
通過requestTask
,可中斷請求任務。
requestTask 物件的方法列表
方法 | 引數 | 說明 |
---|---|---|
abort | 中斷請求任務 | |
offHeadersReceived | 取消監聽 HTTP Response Header 事件,僅微信小程式平臺 支援,文件詳情 |
|
onHeadersReceived | 監聽 HTTP Response Header 事件。會比請求完成事件更早,僅微信小程式平臺 支援,文件詳情 |
示例
const requestTask = uni.request({
url: 'https://www.example.com/request', //僅為示例,並非真實介面地址。
data: {
name: 'name',
age: 18
},
success: function(res) {
console.log(res.data);
}
});
// 中斷請求任務
requestTask.abort();
Tips
- 請求的
header
中content-type
預設為application/json
。 - 避免在
header
中使用中文,或者使用 encodeURIComponent 進行編碼,否則在百度小程式報錯。(來自:快狗打車前端團隊) - 網路請求的
超時時間
可以統一在manifest.json
中配置networkTimeout。 - H5 端本地除錯需注意跨域問題,參考:除錯跨域問題解決方案
- 注意由於百度小程式iOS客戶端,請求失敗時會進入fail回撥,需要針對百度增加相應的處理以解決該問題。
- 注意非 H5 端不支援自動保持 cookie,伺服器應避免驗證 cookie。如果伺服器無法修改,也可以使用一些模擬手段,比如這樣的工具https://github.com/charleslo1/weapp-cookie可以請求時帶上 cookie 並將響應的 cookie 儲存在本地。
- H5端 cookie 受跨域限制(和平時開發網站時一樣),但 uni.request 目前未支援 withCredentials 配置,可以直接使用 xhr 物件或者其他類庫。
- 根據 W3C 規範,H5 端無法獲取 response header 中 Set-Cookie、Set-Cookie2 這2個欄位,對於跨域請求,允許獲取的 response header 欄位只限於“simple response header”和“Access-Control-Expose-Headers”(詳情)
- uni-app 外掛市場有flyio、axios等三方封裝的攔截器可用
- 低版本手機自身不支援 ipv6,如果伺服器僅允許 ipv6,會導致老手機無法正常執行或訪問速度非常慢
- localhost、127.0.0.1等伺服器地址,只能在電腦端執行,手機端連線時不能訪問。請使用標準IP並保證手機能連線電腦網路
- debug 模式,安卓端暫時無法獲取響應頭,url中含有非法字元(如未編碼為%20的空格)時會請求失敗
- iOS App第一次安裝啟動後,會彈出是否允許聯網的詢問框,在使用者點選同意前,呼叫聯網API會失敗。請注意判斷這種情況。比如官方提供的新聞模板示例(HBuilderX新建專案可選擇),會判斷如果無法聯網,則提供一個錯誤頁,提示使用者設定網路及下拉重新整理重試。
- 良好體驗的App,還會判斷當前是否處於飛航模式(參考)、是wifi還是3G(參考)
- 部分安卓裝置,真機執行或debug模式下的網路,低於release模式很多。
- 使用一些比較小眾的證書機構(如:CFCA OV OCA)簽發的 ssl 證書在安卓裝置請求會失敗,因為這些機構的根證書不在系統內建根證書庫,可以更換其他常見機構簽發的證書(如:Let's Encrypt),或者配置 sslVerify 為 false 關閉 ssl 證書驗證(不推薦)。
- 單次網路請求資料量建議控制在50K以下(僅指json資料,不含圖片),過多資料應分頁獲取,以提升應用體驗。
<template> <view> <view> <text selectable>唱跳Rap籃球{{name}}</text> </view> <view> <text selectable space="emsp">唱跳 Rap 籃球-{{name}}</text> </view> <view class="box" hover-class="box-active"> <!-- hover-stop-propagation阻止冒泡 --> <view class="box1" :hover-start-time="2000" :hover-stay-time="2000" hover-class="box1-active" hover-stop-propagation></view> </view> <view> <text>{{btn}}</text> <button @click="set_btn()" size="default" type="primary" plain loading>按鈕</button> </view> <image src="http://img.gucci-outlets-online.com:8088/catch_down/20200427124446_683364.gif" mode="aspectFit"></image> <view v-for="(item,index) in arr" :key='item.id'> <view class="gogogo"> {{index}}-{{item.title}}year{{item.year}} <!-- 事蹟{{item.content}} --> </view> </view> </view> </template> <script> export default { data() { return { name: "菜菜", btn: "", arr: [], } }, methods: { set_btn() { this.btn = "愛了愛了", this.send_Get() }, send_Get() { let _this = this uni.request({ method: 'GET', url: 'https://api.jisuapi.com/todayhistory/query', data: { appkey: 'd1e87a8e45ba7749', month: 2, day: 18 }, success(res) { console.log(res.data) console.log(res.data.result) _this.arr = res.data.result }, }) } }, onPullDownRefresh() { console.log("重新整理了") }, onReachBottom() { console.log("觸底了") } } </script> <style> .box { width: 200px; height: 200px; background: #007AFF; } .box-active { background: red; } .box1 { width: 100px; height: 100px; background: #4CD964; } .box1-active { background: white; } .gogogo { margin: 30px auto; /* padding: 50px 30px; */ } </style>