request.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. export default class request {
  2. constructor(options) {
  3. //请求公共地址
  4. this.baseUrl = options.baseUrl || "";
  5. //公共文件上传请求地址
  6. this.fileUrl = options.fileUrl || "";
  7. //默认请求头
  8. this.headers = options.headers || {};
  9. //默认配置
  10. this.config = {
  11. isPrompt: options.isPrompt === false ? false : true,
  12. load: options.load === false ? false : true,
  13. isFactory: options.isFactory === false ? false : true,
  14. loadMore: options.loadMore === false ? false : true
  15. };
  16. }
  17. // 获取默认信息
  18. getDefault(url, options, type) {
  19. //判断url是不是链接
  20. var urlType = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$/.test(url);
  21. let httpUrl;
  22. if (type == "file") {
  23. httpUrl = urlType ? url : this.fileUrl + url;
  24. } else {
  25. httpUrl = urlType ? url : this.baseUrl + url;
  26. }
  27. let config = Object.assign({}, this.config, options);
  28. //请求地址
  29. config.httpUrl = httpUrl;
  30. //请求头
  31. config.headers = Object.assign(this.headers, options.headers);
  32. return config;
  33. }
  34. //post请求
  35. post(url = '', data = {}, options = {}) {
  36. let requestInfo = this.getDefault(url, options, "data");
  37. requestInfo.data = data;
  38. return new Promise((resolve, reject) => {
  39. this.getRequest("POST", requestInfo, (state, response) => {
  40. //是否用外部的数据处理方法
  41. if (state && requestInfo.isFactory && this.dataFactory) {
  42. //数据处理
  43. var factoryInfo = this.dataFactory(requestInfo, response);
  44. // console.log(factoryInfo)
  45. return resolve(factoryInfo.result)
  46. // factoryInfo.success ? resolve(factoryInfo.result) : reject(factoryInfo.result);
  47. } else {
  48. // console.log(response, response)
  49. state ? resolve(response) : reject(response);
  50. }
  51. });
  52. });
  53. }
  54. //get请求
  55. get(url = '', data = {}, options = {}) {
  56. let requestInfo = this.getDefault(url, options, "data");
  57. requestInfo.data = data;
  58. return new Promise((resolve, reject) => {
  59. this.getRequest("GET", requestInfo, (state, response) => {
  60. //是否用外部的数据处理方法
  61. if (state && requestInfo.isFactory && this.dataFactory) {
  62. //数据处理
  63. var factoryInfo = this.dataFactory(requestInfo, response);
  64. factoryInfo.success ? resolve(factoryInfo.result) : reject(factoryInfo.result);
  65. } else {
  66. state ? resolve(response) : reject(response);
  67. }
  68. });
  69. });
  70. }
  71. //put请求
  72. put(url = '', data = {}, options = {}) {
  73. let requestInfo = this.getDefault(url, options, "data");
  74. requestInfo.data = data;
  75. return new Promise((resolve, reject) => {
  76. this.getRequest("PUT", requestInfo, (state, response) => {
  77. //是否用外部的数据处理方法
  78. if (state && requestInfo.isFactory && this.dataFactory) {
  79. //数据处理
  80. var factoryInfo = this.dataFactory(requestInfo, response);
  81. factoryInfo.success ? resolve(factoryInfo.result) : reject(factoryInfo.result);
  82. } else {
  83. state ? resolve(response) : reject(response);
  84. }
  85. });
  86. });
  87. }
  88. //delete请求
  89. delete(url = '', data = {}, options = {}) {
  90. let requestInfo = this.getDefault(url, options, "data");
  91. requestInfo.data = data;
  92. return new Promise((resolve, reject) => {
  93. this.getRequest("DELETE", requestInfo, (state, response) => {
  94. //是否用外部的数据处理方法
  95. if (state && requestInfo.isFactory && this.dataFactory) {
  96. //数据处理
  97. var factoryInfo = this.dataFactory(requestInfo, response);
  98. factoryInfo.success ? resolve(factoryInfo.result) : reject(factoryInfo.result);
  99. } else {
  100. state ? resolve(response) : reject(response);
  101. }
  102. });
  103. });
  104. }
  105. //接口请求方法
  106. getRequest(ajaxType, options, callback) {
  107. //请求前回调
  108. if (this.requestStart) {
  109. options.method = ajaxType;
  110. var requestStart = this.requestStart(options);
  111. if (typeof requestStart == "object") {
  112. options.data = requestStart.data;
  113. options.headers = requestStart.headers;
  114. options.isPrompt = requestStart.isPrompt;
  115. options.load = requestStart.load;
  116. options.isFactory = requestStart.isFactory;
  117. } else {
  118. callback(false, "请求开始拦截器未通过");
  119. return;
  120. }
  121. }
  122. // console.log(options.data)
  123. let data = { ...options.data }
  124. let copaData = {}
  125. for (const key in data) {
  126. if (data[key] !== null && data[key] !== undefined) {
  127. copaData[key] = data[key]
  128. }
  129. }
  130. // console.log(copaData)
  131. uni.request({
  132. url: options.httpUrl,
  133. data: copaData,
  134. method: ajaxType, //请求类型
  135. header: options.headers, //加入请求头
  136. success: (res) => {
  137. // ;
  138. //请求完成回调
  139. this.requestEnd && this.requestEnd(options, res);
  140. callback(true, res);
  141. },
  142. fail: (err) => {
  143. // console.log(err);
  144. //请求完成回调
  145. this.requestEnd && this.requestEnd(options, err);
  146. callback(false, err);
  147. }
  148. });
  149. }
  150. //jsonp请求(只限于H5使用)
  151. jsonp(url = '', data = {}, options = {}) {
  152. let requestInfo = this.getDefault(url, options, "data");
  153. let dataStr = '';
  154. Object.keys(data).forEach(key => {
  155. dataStr += key + '=' + data[key] + '&';
  156. });
  157. //匹配最后一个&并去除
  158. if (dataStr !== '') {
  159. dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
  160. }
  161. requestInfo.httpUrl = requestInfo.httpUrl + '?' + dataStr;
  162. const _this = this;
  163. return new Promise((resolve, reject) => {
  164. let callbackName = "callback" + Math.ceil(Math.random() * 1000000);
  165. if (_this.requestStart) {
  166. requestInfo.data = data;
  167. var requestStart = _this.requestStart(requestInfo);
  168. if (typeof requestStart == "object") {
  169. requestInfo.data = requestStart.data;
  170. requestInfo.headers = requestStart.headers;
  171. requestInfo.isPrompt = requestStart.isPrompt;
  172. requestInfo.load = requestStart.load;
  173. requestInfo.isFactory = requestStart.isFactory;
  174. } else {
  175. reject("请求开始拦截器未通过");
  176. return;
  177. }
  178. }
  179. window[callbackName] = function (data) {
  180. resolve(data);
  181. }
  182. var script = document.createElement("script");
  183. script.src = requestInfo.httpUrl + "&callback=" + callbackName;
  184. document.head.appendChild(script);
  185. // 及时删除,防止加载过多的JS
  186. document.head.removeChild(script);
  187. //请求完成回调
  188. _this.requestEnd && _this.requestEnd(requestInfo, {});
  189. });
  190. }
  191. //本地服务器图片上传
  192. urlImgUpload(url = '', data = {}, options = {}) {
  193. let requestInfo = this.getDefault(url, options, "file");
  194. requestInfo.data = data;
  195. const _this = this;
  196. return new Promise((resolve, reject) => {
  197. uni.chooseImage({
  198. count: data.count || 9, //默认9
  199. sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  200. sourceType: data.sourceType || ['album', 'camera'], //从相册选择
  201. success: function (res) {
  202. _this.urlFileUpload(requestInfo, res.tempFiles, (state, response) => {
  203. state ? resolve(response) : reject(response);
  204. });
  205. }
  206. });
  207. });
  208. }
  209. //本地服务器文件上传方法
  210. urlFileUpload(options, files, callback) {
  211. const _this = this;
  212. //请求前回调
  213. if (this.requestStart) {
  214. options.method = "FILE";
  215. var requestStart = this.requestStart(options);
  216. if (typeof requestStart == "object") {
  217. if (typeof requestStart == "object") {
  218. options.data = requestStart.data;
  219. options.headers = requestStart.headers;
  220. options.isPrompt = requestStart.isPrompt;
  221. options.load = requestStart.load;
  222. options.isFactory = requestStart.isFactory;
  223. } else {
  224. callback(false, "请求开始拦截器未通过");
  225. return;
  226. }
  227. }
  228. }
  229. const len = files.length - 1;
  230. let fileList = new Array;
  231. fileUpload(0);
  232. function fileUpload(i) {
  233. var config = {
  234. url: options.httpUrl,
  235. filePath: files[i].path,
  236. header: options.headers, //加入请求头
  237. name: options.name || "file",
  238. success: (response) => {
  239. response.data = JSON.parse(response.data);
  240. //请求完成回调
  241. _this.requestEnd && _this.requestEnd(options, response);
  242. //是否用外部的数据处理方法
  243. if (options.isFactory && _this.dataFactory) {
  244. //数据处理
  245. var factoryInfo = _this.dataFactory(options, response);
  246. if (factoryInfo.success) {
  247. fileList.push(factoryInfo.result);
  248. if (len <= i) {
  249. callback(true, fileList);
  250. } else {
  251. fileUpload(i + 1);
  252. }
  253. } else {
  254. callback(false, factoryInfo.result);
  255. }
  256. } else {
  257. fileList.push(response.data);
  258. if (len <= i) {
  259. callback(true, fileList);
  260. } else {
  261. fileUpload(i + 1);
  262. }
  263. }
  264. },
  265. fail: (err) => {
  266. //请求完成回调
  267. _this.requestEnd && _this.requestEnd(options, err);
  268. callback(false, err);
  269. }
  270. };
  271. if (options.data) {
  272. config.formData = options.data;
  273. }
  274. uni.uploadFile(config);
  275. }
  276. }
  277. }