diff --git a/src/core/helpers/protocol/network/request.js b/src/core/helpers/protocol/network/request.js index 55605715b7e1c149c5e80c8065dd8ad0f326c346..fd09c0892128ce2434d86e850f39249c5461b5ac 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 4985e29cac2a5b1232ef492e40042c35cc2e78a3..189ad1f48cb7b6e6abf3e89fb02171d4bfd8b613 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 917bc07fb3cc67223f397a8c4a41d69c720638ab..064fbca7617f7100f65533db620d3b86c178cf84 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 34d7c2fa037d9d3236df1025257c4e5052c8c731..e0e30ddb1aa7f45700a92beef492ae03b9020a7b 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 -} +}