diff --git a/src/platforms/quickapp-vue/service/api/network/request.js b/src/platforms/quickapp-vue/service/api/network/request.js new file mode 100644 index 0000000000000000000000000000000000000000..88b020604d193b8eda4ef5aed667a58535cb6754 --- /dev/null +++ b/src/platforms/quickapp-vue/service/api/network/request.js @@ -0,0 +1,134 @@ +import { + publish +} from '../../bridge' + +import stream from '@system.fetch' + +let requestTaskId = 0 +const requestTasks = {} + +const publishStateChange = res => { + publish('onRequestTaskStateChange', res) + delete requestTasks[requestTaskId] +} + +export function createRequestTaskById (requestTaskId, { + url, + data, + header, + method = 'GET', + responseType, + sslVerify = true +} = {}) { + let abortTimeout + let aborted + + const timeout = 60000 + if (timeout) { + abortTimeout = setTimeout(() => { + aborted = true + publishStateChange({ + requestTaskId, + state: 'fail', + statusCode: 0, + errMsg: 'timeout' + }) + }, (timeout + 100)) + } + const options = { + method, + url: url.trim(), + header, + type: responseType, + timeout: timeout || 6e5 + } + if (method !== 'GET') { + options.body = data + } + try { + stream.fetch({ + ...options, + success: ({ + code, + data, + headers + }) => { + console.log(data) + if (aborted) { + return + } + if (abortTimeout) { + clearTimeout(abortTimeout) + } + const statusCode = code + if (statusCode > 0) { + publishStateChange({ + requestTaskId, + state: 'success', + data: data, + statusCode, + header: headers + }) + } else { + publishStateChange({ + requestTaskId, + state: 'fail', + statusCode, + errMsg: 'abort statusCode:' + statusCode + }) + } + }, + fail: (data, code) => { + publishStateChange({ + requestTaskId, + state: 'fail', + statusCode: code, + errMsg: 'abort statusCode:' + code + }) + } + }) + requestTasks[requestTaskId] = { + abort () { + aborted = true + if (abortTimeout) { + clearTimeout(abortTimeout) + } + publishStateChange({ + requestTaskId, + state: 'fail', + statusCode: 0, + 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' + } +} diff --git a/src/platforms/quickapp-vue/service/base-api.js b/src/platforms/quickapp-vue/service/base-api.js index 302b7c293a35dc6f1b302b7ceb1bb457dbca49df..931a424fe2bbbb3a53367d24219ff9c585788225 100644 --- a/src/platforms/quickapp-vue/service/base-api.js +++ b/src/platforms/quickapp-vue/service/base-api.js @@ -5,5 +5,6 @@ export * from 'uni-core/service/api/base/interceptor' export * from 'uni-core/service/api/base/upx2px' export * from 'uni-core/service/api/context/audio' -export * from 'uni-core/service/api/context/background-audio' +export * from 'uni-core/service/api/context/background-audio' +export * from 'uni-core/service/api/network/request' // TODO diff --git a/src/platforms/quickapp-vue/service/bridge.js b/src/platforms/quickapp-vue/service/bridge.js index 3a2b6525075db0bc698fe2c4c448c5fb534d956d..ab4859ecea86cec55902f38ff2e83b638868dec4 100644 --- a/src/platforms/quickapp-vue/service/bridge.js +++ b/src/platforms/quickapp-vue/service/bridge.js @@ -1,3 +1,7 @@ export function invoke (...args) { return global.UniServiceJSBridge.invokeCallbackHandler(...args) } + +export function publish (name, ...args) { + return global.UniServiceJSBridge.emit('api.' + name, ...args) +} diff --git a/src/platforms/quickapp-vue/service/platform-api.js b/src/platforms/quickapp-vue/service/platform-api.js index a0a78e4d43f3fb95b5004969df1f162ae689ffd8..91a86ba4e00592a552694938271e11c016fb51fc 100644 --- a/src/platforms/quickapp-vue/service/platform-api.js +++ b/src/platforms/quickapp-vue/service/platform-api.js @@ -4,3 +4,6 @@ export * from './api/route/redirect-to' // device export * from './api/device/clipboard' + +// network +export * from './api/network/request'