httpModel.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. setState({ httpLoading: true });
  46. return Promise.reject(error);
  47. },
  48. successEvent(response) {
  49. setState({ httpLoading: false });
  50. return response;
  51. },
  52. errorEvent(error) {
  53. setState({ httpLoading: false });
  54. if (error.response.status) {
  55. error.response.data.status = error.response.status;
  56. }
  57. return Promise.reject(error.response.data);
  58. },
  59. httpGet(url, params, needWarning) {
  60. const { getAxiosInstance } = model();
  61. const { warnning } = model("loadingModel");
  62. params = params || {};
  63. return new Promise((resolve, reject) => {
  64. getAxiosInstance()
  65. .get(url, {
  66. params,
  67. })
  68. .then(res => {
  69. resolve(res.data);
  70. })
  71. .catch(e => {
  72. if (needWarning) {
  73. warnning(e.error);
  74. }
  75. reject(e);
  76. });
  77. });
  78. },
  79. httpPost(url, body, options, needWarning) {
  80. const { getAxiosInstance } = model();
  81. const { warnning } = model("loadingModel");
  82. options = options || {};
  83. body = body || {};
  84. if (!(body instanceof FormData)) {
  85. if (options.body !== "json") {
  86. body = qs.stringify(body);
  87. }
  88. }
  89. return new Promise((resolve, reject) => {
  90. getAxiosInstance()
  91. .post(url, body, { withCredentials: true })
  92. .then(res => {
  93. resolve(res.data);
  94. })
  95. .catch(e => {
  96. reject(e);
  97. if (needWarning) {
  98. warnning(e.error);
  99. }
  100. });
  101. });
  102. },
  103. addAsyncStorage(key, value) {
  104. return new Promise(async (resolve, reject) => {
  105. try {
  106. await AsyncStorage.setItem(key, value);
  107. resolve();
  108. } catch (e) {
  109. reject(e);
  110. }
  111. });
  112. },
  113. removeAsyncStorage(key) {
  114. return new Promise(async (resolve, reject) => {
  115. try {
  116. await AsyncStorage.removeItem(key);
  117. resolve();
  118. } catch (e) {
  119. reject(e);
  120. }
  121. });
  122. },
  123. getAsyncStorage(key) {
  124. return new Promise(async (resolve, reject) => {
  125. try {
  126. const val = await AsyncStorage.getItem(key);
  127. resolve(val);
  128. } catch (e) {
  129. reject(e);
  130. }
  131. });
  132. },
  133. }),
  134. };