提交 01df4118 编写于 作者: Q qiang

fix: request 支持 responseType 值为 arraybuffer(app-plus)

上级 1e15549b
......@@ -13,11 +13,11 @@ const method = {
CONNECT: 'CONNECT'
}
const dataType = {
JSON: 'JSON'
JSON: 'json'
}
const responseType = {
TEXT: 'TEXT',
ARRAYBUFFER: 'ARRAYBUFFER'
TEXT: 'text',
ARRAYBUFFER: 'arraybuffer'
}
const encode = encodeURIComponent
......@@ -83,14 +83,14 @@ export const request = {
dataType: {
type: String,
validator (value, params) {
params.dataType = (value || dataType.JSON).toUpperCase()
params.dataType = (value || dataType.JSON).toLowerCase()
}
},
responseType: {
type: String,
validator (value, params) {
value = (value || '').toUpperCase()
value = (value || '').toLowerCase()
params.responseType = Object.values(responseType).indexOf(value) < 0 ? responseType.TEXT : value
}
}
}
}
import {
import {
publish,
requireNativePlugin
} from '../../bridge'
let requestTaskId = 0
const requestTasks = {}
const publishStateChange = res => {
publish('onRequestTaskStateChange', res)
delete requestTasks[requestTaskId]
}
export function createRequestTaskById (requestTaskId, {
url,
data,
header,
method = 'GET'
requireNativePlugin,
base64ToArrayBuffer
} from '../../bridge'
let requestTaskId = 0
const requestTasks = {}
const publishStateChange = res => {
publish('onRequestTaskStateChange', res)
delete requestTasks[requestTaskId]
}
export function createRequestTaskById (requestTaskId, {
url,
data,
header,
method = 'GET',
responseType
} = {}) {
const stream = requireNativePlugin('stream')
const headers = {}
let abortTimeout
let aborted
let hasContentType = false
let aborted
let hasContentType = false
for (const name in header) {
if (!hasContentType && name.toLowerCase() === 'content-type') {
hasContentType = true
......@@ -31,37 +33,38 @@ export function createRequestTaskById (requestTaskId, {
headers[name] = header[name]
}
}
if (!hasContentType && method === 'POST') {
headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
}
headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
}
const timeout = __uniConfig.networkTimeout.request
if (timeout) {
const timeout = __uniConfig.networkTimeout.request
if (timeout) {
abortTimeout = setTimeout(() => {
aborted = true
publishStateChange({
requestTaskId,
state: 'fail',
statusCode: 0,
errMsg: 'timeout'
})
}, timeout)
}
aborted = true
publishStateChange({
requestTaskId,
state: 'fail',
statusCode: 0,
errMsg: 'timeout'
})
}, timeout)
}
const options = {
method,
url: url.trim(),
// weex 官方文档有误,headers 类型实际 object,用 string 类型会无响应
headers,
type: 'text',
type: responseType === 'arraybuffer' ? 'base64' : 'text',
// weex 官方文档未说明实际支持 timeout,单位:ms
timeout: timeout || 6e5
}
if (method !== 'GET') {
options.body = data
}
try {
}
try {
stream.fetch(options, ({
ok,
status,
data,
headers
......@@ -77,7 +80,7 @@ export function createRequestTaskById (requestTaskId, {
publishStateChange({
requestTaskId,
state: 'success',
data,
data: ok && responseType === 'arraybuffer' ? base64ToArrayBuffer(data) : data,
statusCode,
header: headers
})
......@@ -89,7 +92,7 @@ export function createRequestTaskById (requestTaskId, {
errMsg: 'abort'
})
}
})
})
requestTasks[requestTaskId] = {
abort () {
aborted = true
......@@ -103,35 +106,35 @@ export function createRequestTaskById (requestTaskId, {
errMsg: 'abort'
})
}
}
} catch (e) {
return {
requestTaskId,
errMsg: 'createRequestTask:fail'
}
}
return {
requestTaskId,
errMsg: 'createRequestTask:ok'
}
}
export function createRequestTask (args) {
return createRequestTaskById(++requestTaskId, args)
}
export function operateRequestTask ({
requestTaskId,
operationType
} = {}) {
const requestTask = requestTasks[requestTaskId]
if (requestTask && operationType === 'abort') {
requestTask.abort()
return {
errMsg: 'operateRequestTask:ok'
}
}
return {
errMsg: 'operateRequestTask:fail'
}
}
} catch (e) {
return {
requestTaskId,
errMsg: 'createRequestTask:fail'
}
}
return {
requestTaskId,
errMsg: 'createRequestTask:ok'
}
}
export function createRequestTask (args) {
return createRequestTaskById(++requestTaskId, args)
}
export function operateRequestTask ({
requestTaskId,
operationType
} = {}) {
const requestTask = requestTasks[requestTaskId]
if (requestTask && operationType === 'abort') {
requestTask.abort()
return {
errMsg: 'operateRequestTask:ok'
}
}
return {
errMsg: 'operateRequestTask:fail'
}
}
import {
decode
} from 'base64-arraybuffer'
export {
pack,
pack,
unpack,
invoke
}
from 'uni-core/service/bridge'
} from 'uni-core/service/bridge'
export function requireNativePlugin (name) {
return uni.requireNativePlugin(name)
......@@ -36,8 +39,8 @@ export function setStatusBarStyle (statusBarStyle) {
lastStatusBarStyle = statusBarStyle
plus.navigator.setStatusBarStyle(statusBarStyle)
}
}
export function isTabBarPage (path = '') {
if (!(__uniConfig.tabBar && Array.isArray(__uniConfig.tabBar.list))) {
return false
......@@ -61,4 +64,8 @@ export function isTabBarPage (path = '') {
}
}
return false
}
}
export function base64ToArrayBuffer (data) {
return decode(data)
}
......@@ -115,12 +115,12 @@ export function request ({
errMsg: 'request:fail timeout'
})
}, timeout)
xhr.responseType = responseType.toLowerCase()
xhr.responseType = responseType
xhr.onload = function () {
clearTimeout(timer)
let statusCode = xhr.status
let res = responseType === 'TEXT' ? xhr.responseText : xhr.response
if (responseType === 'TEXT' && dataType === 'JSON') {
let res = responseType === 'text' ? xhr.responseText : xhr.response
if (responseType === 'text' && dataType === 'json') {
try {
res = JSON.parse(res)
} catch (error) {
......@@ -152,4 +152,4 @@ export function request ({
}
xhr.send(body)
return requestTask
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册