From 01df4118c233ec8dec7f82fc35f6502506f6a8ff Mon Sep 17 00:00:00 2001 From: qiang Date: Fri, 16 Aug 2019 11:25:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20request=20=E6=94=AF=E6=8C=81=20responseT?= =?UTF-8?q?ype=20=E5=80=BC=E4=B8=BA=20arraybuffer=EF=BC=88app-plus?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/helpers/protocol/network/request.js | 12 +- .../app-plus/service/api/network/request.js | 143 +++++++++--------- src/platforms/app-plus/service/bridge.js | 19 ++- .../h5/service/api/network/request.js | 8 +- 4 files changed, 96 insertions(+), 86 deletions(-) diff --git a/src/core/helpers/protocol/network/request.js b/src/core/helpers/protocol/network/request.js index 55605715b..fd09c0892 100644 --- a/src/core/helpers/protocol/network/request.js +++ b/src/core/helpers/protocol/network/request.js @@ -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 } } -} +} diff --git a/src/platforms/app-plus/service/api/network/request.js b/src/platforms/app-plus/service/api/network/request.js index 4985e29ca..189ad1f48 100644 --- a/src/platforms/app-plus/service/api/network/request.js +++ b/src/platforms/app-plus/service/api/network/request.js @@ -1,28 +1,30 @@ -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' + } } diff --git a/src/platforms/app-plus/service/bridge.js b/src/platforms/app-plus/service/bridge.js index 917bc07fb..064fbca76 100644 --- a/src/platforms/app-plus/service/bridge.js +++ b/src/platforms/app-plus/service/bridge.js @@ -1,9 +1,12 @@ +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) +} diff --git a/src/platforms/h5/service/api/network/request.js b/src/platforms/h5/service/api/network/request.js index 34d7c2fa0..e0e30ddb1 100644 --- a/src/platforms/h5/service/api/network/request.js +++ b/src/platforms/h5/service/api/network/request.js @@ -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 -} +} -- GitLab