234 lines
6.7 KiB
JavaScript
234 lines
6.7 KiB
JavaScript
import request from 'request'
|
|
// import progress from 'request-progress'
|
|
import { debugRequest } from './env'
|
|
import { requestMsg } from './message'
|
|
// import fs from 'fs'
|
|
|
|
const headers = {
|
|
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
|
|
}
|
|
|
|
const fatchData = (url, method, options, callback) => {
|
|
// console.log(url, options)
|
|
console.log('---start---', url)
|
|
return request(url, {
|
|
method,
|
|
headers: Object.assign({}, headers, options.headers || {}),
|
|
Origin: options.origin,
|
|
data: options.data,
|
|
timeout: options.timeout || 10000,
|
|
json: options.format === undefined || options.format === 'json',
|
|
}, (err, resp, body) => {
|
|
if (err) return callback(err, null)
|
|
|
|
// console.log('---end---', url)
|
|
callback(null, resp, body)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* promise 形式的请求方法
|
|
* @param {*} url
|
|
* @param {*} options
|
|
*/
|
|
const buildHttpPromose = (url, options) => {
|
|
let requestObj
|
|
let cancelFn
|
|
const p = new Promise((resolve, reject) => {
|
|
cancelFn = reject
|
|
debugRequest && console.log(`\n---send request------${url}------------`)
|
|
requestObj = fatchData(url, options.method, options, (err, resp, body) => {
|
|
// options.isShowProgress && window.api.hideProgress()
|
|
debugRequest && console.log(`\n---response------${url}------------`)
|
|
debugRequest && console.log(JSON.stringify(body))
|
|
requestObj = null
|
|
cancelFn = null
|
|
if (err) {
|
|
console.log(err.code)
|
|
if (err.code === 'ETIMEDOUT' || err.code == 'ESOCKETTIMEDOUT') {
|
|
const { promise, cancelHttp } = httpFatch(url, options)
|
|
obj.cancelHttp = cancelHttp
|
|
promise.then()
|
|
}
|
|
return reject(err)
|
|
}
|
|
resolve(resp)
|
|
})
|
|
})
|
|
const obj = {
|
|
promise: p,
|
|
cancelHttp() {
|
|
console.log('cancel')
|
|
if (!requestObj) return
|
|
cancelHttp(requestObj)
|
|
cancelFn(new Error(requestMsg.cancelRequest))
|
|
requestObj = null
|
|
cancelFn = null
|
|
},
|
|
}
|
|
return obj
|
|
}
|
|
|
|
/**
|
|
* 请求超时自动重试
|
|
* @param {*} url
|
|
* @param {*} options
|
|
*/
|
|
export const httpFatch = (url, options = { method: 'get' }) => {
|
|
const requestObj = buildHttpPromose(url, options)
|
|
requestObj.promise = requestObj.promise.catch(err => {
|
|
if (err.code === 'ETIMEDOUT' || err.code == 'ESOCKETTIMEDOUT') {
|
|
const { promise, cancelHttp } = httpFatch(url, options)
|
|
requestObj.cancelHttp()
|
|
requestObj.cancelHttp = cancelHttp
|
|
return promise
|
|
}
|
|
if (err.message === 'socket hang up') {
|
|
// window.globalObj.apiSource = 'temp'
|
|
return Promise.reject(new Error(requestMsg.unachievable))
|
|
}
|
|
if (err.code === 'ENOTFOUND') return Promise.reject(new Error(requestMsg.notConnectNetwork))
|
|
return Promise.reject(err)
|
|
})
|
|
return requestObj
|
|
}
|
|
|
|
/**
|
|
* 取消请求
|
|
* @param {*} index
|
|
*/
|
|
export const cancelHttp = requestObj => {
|
|
if (!requestObj) return
|
|
console.log('cancel:', requestObj.href)
|
|
requestObj.abort()
|
|
}
|
|
|
|
|
|
/**
|
|
* http 请求
|
|
* @param {*} url 地址
|
|
* @param {*} options 选项
|
|
* @param {*} cb 回调
|
|
* @return {Number} index 用于取消请求
|
|
*/
|
|
export const http = (url, options, cb) => {
|
|
if (typeof options === 'function') {
|
|
cb = options
|
|
options = {}
|
|
}
|
|
|
|
// 默认选项
|
|
if (options.method == null) options.method = 'get'
|
|
|
|
debugRequest && console.log(`\n---send request------${url}------------`)
|
|
return fatchData(url, options.method, options, (err, resp, body) => {
|
|
// options.isShowProgress && window.api.hideProgress()
|
|
debugRequest && console.log(`\n---response------${url}------------`)
|
|
debugRequest && console.log(JSON.stringify(body))
|
|
if (err) {
|
|
debugRequest && console.log(JSON.stringify(err))
|
|
}
|
|
cb(err, resp, body)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* http get 请求
|
|
* @param {*} url 地址
|
|
* @param {*} options 选项
|
|
* @param {*} callback 回调
|
|
* @return {Number} index 用于取消请求
|
|
*/
|
|
export const httpGet = (url, options, callback) => {
|
|
if (typeof options === 'function') {
|
|
callback = options
|
|
options = {}
|
|
}
|
|
// options.isShowProgress && window.api.showProgress({
|
|
// title: options.progressMsg || '请求中',
|
|
// modal: true,
|
|
// })
|
|
|
|
debugRequest && console.log(`\n---send request-------${url}------------`)
|
|
return fatchData(url, 'get', options, function(err, resp, body) {
|
|
// options.isShowProgress && window.api.hideProgress()
|
|
debugRequest && console.log(`\n---response------${url}------------`)
|
|
debugRequest && console.log(JSON.stringify(body))
|
|
if (err) {
|
|
debugRequest && console.log(JSON.stringify(err))
|
|
}
|
|
callback(err, resp, body)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* http post 请求
|
|
* @param {*} url 请求地址
|
|
* @param {*} data 提交的数据
|
|
* @param {*} options 选项
|
|
* @param {*} callback 回调
|
|
* @return {Number} index 用于取消请求
|
|
*/
|
|
export const httpPost = (url, data, options, callback) => {
|
|
if (typeof options === 'function') {
|
|
callback = options
|
|
options = {}
|
|
}
|
|
// options.isShowProgress && window.api.showProgress({
|
|
// title: options.progressMsg || '请求中',
|
|
// modal: true,
|
|
// })
|
|
options.data = data
|
|
|
|
debugRequest && console.log(`\n---send request-------${url}------------`)
|
|
return fatchData(url, 'post', options, function(err, resp, body) {
|
|
// options.isShowProgress && window.api.hideProgress()
|
|
debugRequest && console.log(`\n---response------${url}------------`)
|
|
debugRequest && console.log(JSON.stringify(body))
|
|
if (err) {
|
|
debugRequest && console.log(JSON.stringify(err))
|
|
}
|
|
callback(err, resp, body)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* http jsonp 请求
|
|
* @param {*} url 请求地址
|
|
* @param {*} options 选项
|
|
* options.jsonpCallback 回调
|
|
* @param {*} callback 回调
|
|
* @return {Number} index 用于取消请求
|
|
*/
|
|
export const http_jsonp = (url, options, callback) => {
|
|
if (typeof options === 'function') {
|
|
callback = options
|
|
options = {}
|
|
}
|
|
|
|
let jsonpCallback = 'jsonpCallback'
|
|
if (url.indexOf('?') < 0) url += '?'
|
|
url += `&${options.jsonpCallback}=${jsonpCallback}`
|
|
|
|
options.format = 'script'
|
|
|
|
// options.isShowProgress && window.api.showProgress({
|
|
// title: options.progressMsg || '请求中',
|
|
// modal: true,
|
|
// })
|
|
|
|
debugRequest && console.log(`\n---send request-------${url}------------`)
|
|
return fatchData(url, 'get', options, function(err, resp, body) {
|
|
// options.isShowProgress && window.api.hideProgress()
|
|
debugRequest && console.log(`\n---response------${url}------------`)
|
|
debugRequest && console.log(JSON.stringify(body))
|
|
if (err) {
|
|
debugRequest && console.log(JSON.stringify(err))
|
|
} else {
|
|
body = JSON.parse(body.replace(new RegExp(`^${jsonpCallback}\\(({.*})\\)$`), '$1'))
|
|
}
|
|
|
|
callback(err, resp, body)
|
|
})
|
|
}
|