React中使用axios发送请求的几种常用方法

编辑: admin 分类: javascript 发布时间: 2022-01-01 来源:互联网
目录
  • React中安装并引入axios依赖
  • 使用axios进行GET请求
    • 使用axios.get方式
    • 使用axios(config {...})
  • 使用axios进行POST请求
    • 使用axios.post
    • 使用axios(config {...})
  • 同时发送多个请求
    • 详细config对象配置项
      • axios的返回值对象response
        • axios的全局配置
          • axios的单一实例化配置
            • axios拦截器的使用

              React中安装并引入axios依赖

              在React项目中使用axios请求,首先需要安装axios:

              npm install axios --save
              

              然后在react文件中使用typescript方式导入axios依赖:

              import axios from 【原URL http://www.nextecloud.cn转载请说明出处】'axios';
              

              使用axios进行GET请求

              axios中使用GET请求时有两中方式:

              • 一种是使用axios.get的方式进行
              • 一种是使用axios(config { ... })的方式进行

              使用axios.get方式

              使用封装的axios.get进行请求的常用格式如下:

              // Make a request for a user with a given ID
              axios.get('/getUser?id=12345')
                .then(function (response) {
                  // handle success
                  console.log(response);
               
                  // update state or do something
                  this.setState({
                    // ...
                  })
                })
                .catch(function (error) {
                  // handle error
                  console.log(error);
                })
                .then(function () {
                  // always executed
                });
               
              // Optionally the request above could also be done as
              axios.get('/getUser', {
                  params: { // 这里的参数设置为URL参数(根据URL携带参数)
                    id: 12345
                  }
                })
                .then(function (response) {
                  console.log(response);
                })
                .catch(function (error) {
                  console.log(error);
                })
                .then(function () {
                  // always executed
                });  
               
              // Want to use async/await? Add the `async` keyword to your outer function/method.
              async function getUser() {
                try {
                  const response = await axios.get('/getUser?id=12345');
                  console.log(response);
                } catch (error) {
                  console.error(error);
                }
              }
              

              使用axios(config {...})

              使用axios(config {...}) 的方式发送GET请求格式如下:

              axios({
                method: 'get',
                url: '/getUser',
                params: {
                  id: 12345,
                }
              })
                .then(function (response) {
                  console.log(response);
                });
              

              以上的get请求发送的URL均为如下:

              http:HOST_IP:XXXX/getUser?id=12345

              使用axios进行POST请求

              同GET请求一样,使用POST也有两种请求方式。

              使用axios.post

              axios.post('/createUser', {
                  firstName: 'Fred',
                  lastName: 'Flintstone'
                })
                .then(function (response) {
                  console.log(response);
                })
                .catch(function (error) {
                  console.log(error);
                });
              

              使用axios(config {...})

                  // Send a POST request
                  axios({
                    method: 'post',
                    url: '/createUser',
                    data: { // 这里data中的参数为requestBody参数,服务端需要使用@RequestBody注解进行获取
                      firstName: 'Fred',
                      lastName: 'Flintstone'
                    }
                  }).then(function (response) {
                    console.log(response);
                  }).catch(function (error) {
                    console.log(error);
                  });
              

              需要注意的是,在使用axios(config {})方式进行GET或POST请求发送时,GET请求中params为URL参数,POST请求中data为RequestBody参数,在服务端需要使用@RequestBody注解接收,Spring Boot能够自动解析为Java相应的对象。

              同时发送多个请求

              使用axios也可以一次发送多个请求:

              function getUserAccount() {
                return axios.get('/user/12345');
              }
               
              function getUserPermissions() {
                return axios.get('/user/12345/permissions');
              }
               
              axios.all([getUserAccount(), getUserPermissions()])
                .then(axios.spread(function (acct, perms) {
                  // Both requests are now complete
                }));
              

              详细config对象配置项

              在axios的readme文档中,有对config对象的具体配置说明,如下:

              {
                // `url` is the server URL that will be used for the request
                url: '/user',
               
                // `method` is the request method to be used when making the request
                method: 'get', // default
               
                // `baseURL` will be prepended to `url` unless `url` is absolute.
                // It can be convenient to set `baseURL` for an instance of axios to pass relative URLs
                // to methods of that instance.
                baseURL: 'https://some-domain.com/api/',
               
                // `transformRequest` allows changes to the request data before it is sent to the server
                // This is only applicable for request methods 'PUT', 'POST', 'PATCH' and 'DELETE'
                // The last function in the array must return a string or an instance of Buffer, ArrayBuffer,
                // FormData or Stream
                // You may modify the headers object.
                transformRequest: [function (data, headers) {
                  // Do whatever you want to transform the data
               
                  return data;
                }],
               
                // `transformResponse` allows changes to the response data to be made before
                // it is passed to then/catch
                transformResponse: [function (data) {
                  // Do whatever you want to transform the data
               
                  return data;
                }],
               
                // `headers` are custom headers to be sent
                headers: {'X-Requested-With': 'XMLHttpRequest'},
               
                // `params` are the URL parameters to be sent with the request
                // Must be a plain object or a URLSearchParams object
                params: {
                  ID: 12345
                },
               
                // `paramsSerializer` is an optional function in charge of serializing `params`
                // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
                paramsSerializer: function (params) {
                  return Qs.stringify(params, {arrayFormat: 'brackets'})
                },
               
                // `data` is the data to be sent as the request body
                // Only applicable for request methods 'PUT', 'POST', and 'PATCH'
                // When no `transformRequest` is set, must be of one of the following types:
                // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
                // - Browser only: FormData, File, Blob
                // - Node only: Stream, Buffer
                data: {
                  firstName: 'Fred'
                },
                
                // syntax alternative to send data into the body
                // method post
                // only the value is sent, not the key
                data: 'Country=Brasil&City=Belo Horizonte',
               
                // `timeout` specifies the number of milliseconds before the request times out.
                // If the request takes longer than `timeout`, the request will be aborted.
                timeout: 1000, // default is `0` (no timeout)
               
                // `withCredentials` indicates whether or not cross-site Access-Control requests
                // should be made using credentials
                withCredentials: false, // default
               
                // `adapter` allows custom handling of requests which makes testing easier.
                // Return a promise and supply a valid response (see lib/adapters/README.md).
                adapter: function (config) {
                  /* ... */
                },
               
                // `auth` indicates that HTTP Basic auth should be used, and supplies credentials.
                // This will set an `Authorization` header, overwriting any existing
                // `Authorization` custom headers you have set using `headers`.
                // Please note that only HTTP Basic auth is configurable through this parameter.
                // For Bearer tokens and such, use `Authorization` custom headers instead.
                auth: {
                  username: 'janedoe',
                  password: 's00pers3cret'
                },
               
                // `responseType` indicates the type of data that the server will respond with
                // options are: 'arraybuffer', 'document', 'json', 'text', 'stream'
                //   browser only: 'blob'
                responseType: 'json', // default
               
                // `responseEncoding` indicates encoding to use for decoding responses
                // Note: Ignored for `responseType` of 'stream' or client-side requests
                responseEncoding: 'utf8', // default
               
                // `xsrfCookieName` is the name of the cookie to use as a value for xsrf token
                xsrfCookieName: 'XSRF-TOKEN', // default
               
                // `xsrfHeaderName` is the name of the http header that carries the xsrf token value
                xsrfHeaderName: 'X-XSRF-TOKEN', // default
               
                // `onUploadProgress` allows handling of progress events for uploads
                // browser only
                onUploadProgress: function (progressEvent) {
                  // Do whatever you want with the native progress event
                },
               
                // `onDownloadProgress` allows handling of progress events for downloads
                // browser only
                onDownloadProgress: function (progressEvent) {
                  // Do whatever you want with the native progress event
                },
               
                // `maxContentLength` defines the max size of the http response content in bytes allowed
                maxContentLength: 2000,
               
                // `validateStatus` defines whether to resolve or reject the promise for a given
                // HTTP response status code. If `validateStatus` returns `true` (or is set to `null`
                // or `undefined`), the promise will be resolved; otherwise, the promise will be
                // rejected.
                validateStatus: function (status) {
                  return status >= 200 && status < 300; // default
                },
               
                // `maxRedirects` defines the maximum number of redirects to follow in node.js.
                // If set to 0, no redirects will be followed.
                maxRedirects: 5, // default
               
                // `socketPath` defines a UNIX Socket to be used in node.js.
                // e.g. '/var/run/docker.sock' to send requests to the docker daemon.
                // Only either `socketPath` or `proxy` can be specified.
                // If both are specified, `socketPath` is used.
                socketPath: null, // default
               
                // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http
                // and https requests, respectively, in node.js. This allows options to be added like
                // `keepAlive` that are not enabled by default.
                httpAgent: new http.Agent({ keepAlive: true }),
                httpsAgent: new https.Agent({ keepAlive: true }),
               
                // `proxy` defines the hostname and port of the proxy server.
                // You can also define your proxy using the conventional `http_proxy` and
                // `https_proxy` environment variables. If you are using environment variables
                // for your proxy configuration, you can also define a `no_proxy` environment
                // variable as a comma-separated list of domains that should not be proxied.
                // Use `false` to disable proxies, ignoring environment variables.
                // `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and
                // supplies credentials.
                // This will set an `Proxy-Authorization` header, overwriting any existing
                // `Proxy-Authorization` custom headers you have set using `headers`.
                proxy: {
                  host: '127.0.0.1',
                  port: 9000,
                  auth: {
                    username: 'mikeymike',
                    password: 'rapunz3l'
                  }
                },
               
                // `cancelToken` specifies a cancel token that can be used to cancel the request
                // (see Cancellation section below for details)
                cancelToken: new CancelToken(function (cancel) {
                })
              }
              

              axios的返回值对象response

              axios在进行请求后得到的response对象格式如下:

              {
                // `data` is the response that was provided by the server
                data: {},
               
                // `status` is the HTTP status code from the server response
                status: 200,
               
                // `statusText` is the HTTP status message from the server response
                statusText: 'OK',
               
                // `headers` the HTTP headers that the server responded with
                // All header names are lower cased and can be accessed using the bracket notation.
                // Example: `response.headers['content-type']`
                headers: {},
               
                // `config` is the config that was provided to `axios` for the request
                config: {},
               
                // `request` is the request that generated this response
                // It is the last ClientRequest instance in node.js (in redirects)
                // and an XMLHttpRequest instance in the browser
                request: {}
              }
              

              当在请求后使用then方法时,可以获取response对象的各个属性值,其中data即为服务端返回的相应对象:

              axios.get('/user/12345')
                .then(function (response) {
                  console.log(response.data);
                  console.log(response.status);
                  console.log(response.statusText);
                  console.log(response.headers);
                  console.log(response.config);
                });
              

              axios的全局配置

              在使用axios时,可以对axios对象进行全局的设置,该设置会应用于axios所在当前javascript类中的所有axios请求中,例如如下的设置:

              axios.defaults.baseURL = 'https://api.example.com';
              axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
              axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
              

              axios的单一实例化配置

              如果不需对axios进行全局设置,则可以在使用某个axios对象时,进行单一对象的设置,例如如下:

              // Set config defaults when creating the instance
              const instance = axios.create({
                baseURL: 'https://api.example.com'
              });
               
              // Alter defaults after instance has been created
              instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
              

              axios拦截器的使用

              可以使用axios拦截器来在发送请求之前或在响应response之前(then方法)来拦截请求并进行自定义的设置,定义request和response拦截器示例如下:

              // Add a request interceptor
              axios.interceptors.request.use(function (config) {
                  // Do something before request is sent
                  return config;
                }, function (error) {
                  // Do something with request error
                  return Promise.reject(error);
                });
               
              // Add a response interceptor
              axios.interceptors.response.use(function (response) {
                  // Any status code that lie within the range of 2xx cause this function to trigger
                  // Do something with response data
                  return response;
                }, function (error) {
                  // Any status codes that falls outside the range of 2xx cause this function to trigger
                  // Do something with response error
                  return Promise.reject(error);
                });
              

              当需要删除拦截器时,进行如下操作:

              const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
              axios.interceptors.request.eject(myInterceptor);
              

              也可以将定义的拦截器添加到自定义的axios实例中:

              const instance = axios.create();
              instance.interceptors.request.use(function () {/*...*/});
              

              以上部分资料参考自axios文档,具体参见:https://github.com/axios/axios

              到此这篇关于React中使用axios发送请求的几种常用方法的文章就介绍到这了,更多相关React使用axios发送请求内容请搜索hwidc以前的文章或继续浏览下面的相关文章希望大家以后多多支持hwidc!