httpModel.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /* eslint-disable no-async-promise-executor */
  2. import axios from "axios";
  3. import qs from "qs";
  4. import { AsyncStorage } from "react-native";
  5. export default {
  6. state: {
  7. baseUrl: "http://dingdong.izouma.com",
  8. // baseUrl: "http://localhost:8080",
  9. token: "",
  10. config: {},
  11. httpLoading: false,
  12. },
  13. actions: ({ model, setState }) => ({
  14. getAxiosInstance() {
  15. const {
  16. baseUrl,
  17. setConfig,
  18. setConfigError,
  19. successEvent,
  20. errorEvent,
  21. } = model();
  22. const axiosInstance = axios.create({
  23. baseURL: baseUrl,
  24. });
  25. axiosInstance.interceptors.request.use(
  26. config => setConfig(config),
  27. error => setConfigError(error)
  28. );
  29. axiosInstance.interceptors.response.use(
  30. response => successEvent(response),
  31. error => errorEvent(error)
  32. );
  33. return axiosInstance;
  34. },
  35. async setConfig(config) {
  36. setState({ httpLoading: true });
  37. config.headers = config.headers || {};
  38. const token = await AsyncStorage.getItem("token");
  39. if (token) {
  40. config.headers.Authorization = `Bearer ${token}`;
  41. }
  42. return config;
  43. },
  44. setConfigError(error) {
  45. return Promise.reject(error);
  46. },
  47. successEvent(response) {
  48. return response;
  49. },
  50. errorEvent(error) {
  51. if (error.response.status) {
  52. error.response.data.status = error.response.status;
  53. }
  54. return Promise.reject(error.response.data);
  55. },
  56. httpGet(url, params, needWarning) {
  57. const { getAxiosInstance } = model();
  58. const { loading, warnning, clearLoading } = model("loadingModel");
  59. params = params || {};
  60. // loading();
  61. return new Promise((resolve, reject) => {
  62. getAxiosInstance()
  63. .get(url, {
  64. params,
  65. })
  66. .then(res => {
  67. resolve(res.data);
  68. if (!needWarning) {
  69. clearLoading();
  70. }
  71. })
  72. .catch(e => {
  73. if (needWarning) {
  74. warnning(e.error);
  75. }
  76. reject(e);
  77. });
  78. });
  79. },
  80. httpPost(url, body, options, needWarning) {
  81. const { getAxiosInstance } = model();
  82. const { loading, warnning, clearLoading } = model("loadingModel");
  83. // loading();
  84. options = options || {};
  85. body = body || {};
  86. if (!(body instanceof FormData)) {
  87. if (options.body !== "json") {
  88. body = qs.stringify(body);
  89. }
  90. }
  91. return new Promise((resolve, reject) => {
  92. getAxiosInstance()
  93. .post(url, body, { withCredentials: true })
  94. .then(res => {
  95. resolve(res.data);
  96. if (!needWarning) {
  97. clearLoading();
  98. }
  99. })
  100. .catch(e => {
  101. reject(e);
  102. if (needWarning) {
  103. warnning(e.error);
  104. }
  105. });
  106. });
  107. },
  108. async addAsyncStorage(key, value) {
  109. await AsyncStorage.setItem(key, value);
  110. },
  111. async removeAsyncStorage(key) {
  112. await AsyncStorage.removeItem(key);
  113. },
  114. async getAsyncStorage(key) {
  115. const val = await AsyncStorage.getItem(key);
  116. return Promise.resolve(val);
  117. },
  118. }),
  119. };