request.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  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. uni.request({
  124. url: options.httpUrl,
  125. data: options.data,
  126. method: ajaxType, //请求类型
  127. header: options.headers, //加入请求头
  128. success: (res) => {
  129. // ;
  130. //请求完成回调
  131. this.requestEnd && this.requestEnd(options, res);
  132. callback(true, res);
  133. },
  134. fail: (err) => {
  135. // console.log(err);
  136. //请求完成回调
  137. this.requestEnd && this.requestEnd(options, err);
  138. callback(false, err);
  139. }
  140. });
  141. }
  142. //jsonp请求(只限于H5使用)
  143. jsonp(url = '', data = {}, options = {}) {
  144. let requestInfo = this.getDefault(url, options, "data");
  145. let dataStr = '';
  146. Object.keys(data).forEach(key => {
  147. dataStr += key + '=' + data[key] + '&';
  148. });
  149. //匹配最后一个&并去除
  150. if (dataStr !== '') {
  151. dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
  152. }
  153. requestInfo.httpUrl = requestInfo.httpUrl + '?' + dataStr;
  154. const _this = this;
  155. return new Promise((resolve, reject) => {
  156. let callbackName = "callback" + Math.ceil(Math.random() * 1000000);
  157. if (_this.requestStart) {
  158. requestInfo.data = data;
  159. var requestStart = _this.requestStart(requestInfo);
  160. if (typeof requestStart == "object") {
  161. requestInfo.data = requestStart.data;
  162. requestInfo.headers = requestStart.headers;
  163. requestInfo.isPrompt = requestStart.isPrompt;
  164. requestInfo.load = requestStart.load;
  165. requestInfo.isFactory = requestStart.isFactory;
  166. } else {
  167. reject("请求开始拦截器未通过");
  168. return;
  169. }
  170. }
  171. window[callbackName] = function (data) {
  172. resolve(data);
  173. }
  174. var script = document.createElement("script");
  175. script.src = requestInfo.httpUrl + "&callback=" + callbackName;
  176. document.head.appendChild(script);
  177. // 及时删除,防止加载过多的JS
  178. document.head.removeChild(script);
  179. //请求完成回调
  180. _this.requestEnd && _this.requestEnd(requestInfo, {});
  181. });
  182. }
  183. //本地服务器图片上传
  184. urlImgUpload(url = '', data = {}, options = {}) {
  185. let requestInfo = this.getDefault(url, options, "file");
  186. requestInfo.data = data;
  187. const _this = this;
  188. return new Promise((resolve, reject) => {
  189. uni.chooseImage({
  190. count: data.count || 9, //默认9
  191. sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  192. sourceType: data.sourceType || ['album', 'camera'], //从相册选择
  193. success: function (res) {
  194. _this.urlFileUpload(requestInfo, res.tempFiles, (state, response) => {
  195. state ? resolve(response) : reject(response);
  196. });
  197. }
  198. });
  199. });
  200. }
  201. //本地服务器文件上传方法
  202. urlFileUpload(options, files, callback) {
  203. const _this = this;
  204. //请求前回调
  205. if (this.requestStart) {
  206. options.method = "FILE";
  207. var requestStart = this.requestStart(options);
  208. if (typeof requestStart == "object") {
  209. if (typeof requestStart == "object") {
  210. options.data = requestStart.data;
  211. options.headers = requestStart.headers;
  212. options.isPrompt = requestStart.isPrompt;
  213. options.load = requestStart.load;
  214. options.isFactory = requestStart.isFactory;
  215. } else {
  216. callback(false, "请求开始拦截器未通过");
  217. return;
  218. }
  219. }
  220. }
  221. const len = files.length - 1;
  222. let fileList = new Array;
  223. fileUpload(0);
  224. function fileUpload(i) {
  225. var config = {
  226. url: options.httpUrl,
  227. filePath: files[i].path,
  228. header: options.headers, //加入请求头
  229. name: options.name || "file",
  230. success: (response) => {
  231. response.data = JSON.parse(response.data);
  232. //请求完成回调
  233. _this.requestEnd && _this.requestEnd(options, response);
  234. //是否用外部的数据处理方法
  235. if (options.isFactory && _this.dataFactory) {
  236. //数据处理
  237. var factoryInfo = _this.dataFactory(options, response);
  238. if (factoryInfo.success) {
  239. fileList.push(factoryInfo.result);
  240. if (len <= i) {
  241. callback(true, fileList);
  242. } else {
  243. fileUpload(i + 1);
  244. }
  245. } else {
  246. callback(false, factoryInfo.result);
  247. }
  248. } else {
  249. fileList.push(response.data);
  250. if (len <= i) {
  251. callback(true, fileList);
  252. } else {
  253. fileUpload(i + 1);
  254. }
  255. }
  256. },
  257. fail: (err) => {
  258. //请求完成回调
  259. _this.requestEnd && _this.requestEnd(options, err);
  260. callback(false, err);
  261. }
  262. };
  263. if (options.data) {
  264. config.formData = options.data;
  265. }
  266. uni.uploadFile(config);
  267. }
  268. }
  269. }