Api.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { GET, DELETE, FORM } from './Constant';
  2. /**
  3. * http请求封装类
  4. */
  5. const Request = require('superagent');
  6. function OfflineError(message) {
  7. const error = new Error(message || '网络不给力,请重试');
  8. error.Type = 'offline';
  9. return error;
  10. }
  11. export default class {
  12. constructor() {
  13. this.path = `${__BASE_NAME__ === '/' ? '' : __BASE_NAME__}${__API_PATH__}`;
  14. }
  15. send(url, option) {
  16. /**
  17. * api底层接口
  18. */
  19. const paramList = url.match(/\{.*?\}/g);
  20. if (paramList && paramList.length > 0) {
  21. for (let i = 0; i < paramList.length; i += 1) {
  22. const key = paramList[i].substr(1, paramList[i].length - 2);
  23. const param = option.data[key];
  24. if (!param) return Promise.reject(new Error('参数错误'));
  25. url = url.replace(paramList[i], param);
  26. option.data[key] = null;
  27. }
  28. }
  29. const data = {};
  30. Object.keys(option.data).forEach(i => {
  31. if (option.data[i] || option.data[i] === 0 || option.data[i] === false) data[i] = option.data[i];
  32. });
  33. return new Promise((resolve, reject) => {
  34. const request = Request(option.method, `${this.path}${url}`).accept('application/json');
  35. if (option.method === GET || option.method === DELETE) {
  36. // php后台需要[]来访问数组
  37. // Object.keys(data).forEach(i => {
  38. // if (data[i] instanceof Object && data[i].length > 0) {
  39. // request.field(`${i}[]`, data[i]);
  40. // data[`${i}[]`] = data[i];
  41. // delete data[i];
  42. // }
  43. // });
  44. request.query(data);
  45. }
  46. if (option.method !== GET && option.type !== FORM) {
  47. request.send(data);
  48. }
  49. if (option.type === FORM) {
  50. Object.keys(data).forEach(i => {
  51. if (data[i] instanceof File) {
  52. request.attach(i, data[i], data[i].name);
  53. }
  54. request.field(i, data[i]);
  55. });
  56. }
  57. if (option.headers) {
  58. option.headers.forEach(header => {
  59. request.set(header.key, header.value);
  60. });
  61. }
  62. request.timeout(30 * 1000).end((error, response) => {
  63. if (error) {
  64. if (response && response.body) {
  65. reject(response.body);
  66. } else {
  67. reject(new OfflineError(error));
  68. }
  69. } else {
  70. resolve(response);
  71. }
  72. });
  73. });
  74. }
  75. request(url, option) {
  76. /**
  77. * api处理流程封装
  78. */
  79. return this.send(url, option).then(response => {
  80. if (response.ok && response.body) {
  81. return response.body;
  82. }
  83. throw new OfflineError(response.body ? JSON.parse(response.body) : null);
  84. });
  85. }
  86. }