React ajax 发送请求(六)

React 官网链接:

  • 英文官网
  • 中文官网

接着上节 React 代理配置(五)

前言

在实际做React 项目的时候, 前端应用需要通过 ajax 请求与后台进行交互,React本身只关注于界面, 并不包含发送ajax请求的代码,所以一般 React 应用中需要集成第三方ajax库(或自己封装,但是一般还是借助第三方库来封装,没有自己完全去封装的)

ajax 请求库

常见的在React 用的 ajax 请求库有以下两个:

  • jQuery: 比较重,如果需要另外引入不建议使用

  • axios:轻量级, 建议使用

    • 封装XmlHttpRequest对象的ajax
    • promise风格
    • 可以用在浏览器端和node服务器端
  • fetch:原生函数,不再使用XmlHttpRequest对象提交ajax请求,老版本浏览器可能不支持

下面主要介绍一下axios 与 fetch ,jQuery 一般不建议在React项目中使用,所以这里不做阐述

axios

axios 简单来说,就是使用 promise风格封装XmlHttpRequest对象ajax,不仅仅可用在浏览器端也可用于node服务器端

文档:axios github

安装

根据安装工具的不同,可选择任一来进行安装:

// npm 安装
npm install axios// bower 安装
bower install axios// yarn 安装
yarn add axios

使用介绍

API 介绍

关于 axios 进行后端请求提供了很多相关的API

// 使用即需先引用
import axios from 'axios'axios.request(config)// get 请求
axios.get(url[, config])
// post 请求
axios.post(url[, data[, config]])
// put请求
axios.put(url[, data[, config]])
// delete 请求
axios.delete(url[, config])
// head 请求
axios.head(url[, config])
// options 请求
axios.options(url[, config])
// patch 请求
axios.patch(url[, data[, config]])

说明:

  • url:访问请求的url
  • config:请求的相关config(如果已经利用get请求,指定了url 与 data,config中无需再次配置)常用可配置字段如下:(详细的请查看文档)
{// 请求urlurl: '/user',// 请求方法,默认是 getmethod: 'get', // default// url的前缀baseURL: 'https://some-domain.com/api/',// 请求超时时间,默认是 0 timeout: 1000, // 在请求发送之前修改data / headers,仅仅可在 'PUT', 'POST', 'PATCH' and 'DELETE'使用transformRequest: [function (data, headers) {return data;}],// 在请求响应之前修改datatransformResponse: [function (data) {return data;}],//定制化headersheaders: {'X-Requested-With': 'XMLHttpRequest'},// 请求参数params: {ID: 12345},// request boby 里面的 `data` ,仅仅可在 'PUT', 'POST', 'PATCH' and 'DELETE'使用// 若没有设置`transformRequest` is set, 该字段的类型必须满足下面的要求// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams// 浏览器: FormData, File, Blob// NOde: Stream, Bufferdata: {firstName: 'Fred'},// 上传进度onUploadProgress: function (progressEvent) {},// 下载进度onDownloadProgress: function (progressEvent) {},// http response content 最大字节长度maxContentLength: 2000,// http request content 最大字节长度maxBodyLength: 2000,// 定义了promise是否处理或者拒绝validateStatus: function (status) {return status >= 200 && status < 300; // default},// 服务器相应的类型,可选值为 'arraybuffer', 'document', 'json', 'text', 'stream'// 默认是json,如果是下载文件,可以标注为streamresponseType: 'json', // default// 响应内容编码格式,默认 utf8responseEncoding: 'utf8', // default// 若没有对应token则取消发送请求cancelToken: new CancelToken(function (cancel) {}),
}

请求返回的数据格式:

{// 返回数据,最重要的一个字段data: {},// Http 状态码status: 200,// 状态码对应的状态文本statusText: 'OK',// 服务器响应的headerheaders: {},// request 请求携带的configconfig: {},// 生成该response 的requestrequest: {}
}

一般在实际使用的时候,会创建一个请求实例,设置好一些默认config,若涉及一些请求需要特殊的config,再调用的时候进行覆盖即可,涉及到的API为:

axios.create([config]) // config 可配置为上述说明一致

example:

const instance = axios.create({baseURL: 'https://some-domain.com/api/', // 指定路径前缀timeout: 1000 // 指定超时时间
});

Example

Get 请求,两种方式,一般都会对请求进行封装,常用的是第二种

  • 每个请求单独进行,利用 axios.get API进行请求
  • 进行封装,利用 axios.create API创建一个实例,然后不同的方法分别进行请求
import axios from "axios";
// 第一种,利用get请求API来进行请求
// 参数可直接在url后面拼接
axios.get('/user?ID=12345' , {baseURL: 'https://some-domain.com/api/', // 指定路径前缀timeout: 1000 // 指定超时时间
})
.then(function (response) {console.log(response.data);console.log(response.status);console.log(response.statusText);console.log(response.headers);console.log(response.config);})
.catch(function (error) {console.log(error);
});// 第二种,设置实例后来进行请求,实例设置好默认的config
const instance = axios.create({baseURL: 'https://some-domain.com/api/', // 指定路径前缀timeout: 1000 // 指定超时时间
});
instance['get']('/user?ID=12345').then(function (response) {console.log(response.data);console.log(response.status);console.log(response.statusText);console.log(response.headers);console.log(response.config);})
.catch(function (error) {console.log(error);
});

Post请求:

,两种方式,一般都会对请求进行封装,常用的是第二种

  • 每个请求单独进行,利用 axios.post API进行请求
  • 进行封装,利用 axios.create API创建一个实例,然后不同的方法分别进行请求
// 第一种,利用post请求API来进行请求
// post请求,第一个参数是url,第二个参数是data,data 以对象的方式进行传入
axios.post('/user', { firstName: 'Fred',lastName: 'Flintstone'
}, { // 指定header(如果规定要以form-data请求)baseURL: 'https://some-domain.com/api/', // 指定路径前缀timeout: 1000, // 指定超时时间headers: { // 指定header'Content-Type': 'multipart/form-data'
})
.then(function (response) {console.log(response.data);console.log(response.status);console.log(response.statusText);console.log(response.headers);console.log(response.config);
})
.catch(function (error) {console.log(error);
});// 第二种,先设置一些请求都默认的config
const instance = axios.create({baseURL: 'https://some-domain.com/api/', // 指定路径前缀timeout: 1000 // 指定超时时间
});instance['post']('/user', { firstName: 'Fred',lastName: 'Flintstone'
}, { // 单独再指定header(如果规定要以form-data请求)headers: { // 指定header'Content-Type': 'multipart/form-data'
}).then(function (response) {console.log(response.data);console.log(response.status);console.log(response.statusText);console.log(response.headers);console.log(response.config);})
.catch(function (error) {console.log(error);
});

fetch

fetch ,自带的原生函数,不再使用XmlHttpRequest对象提交ajax请求,其设计符合关注分离(Separation of Concerns)的原则,有的老版本浏览器可能不支持,它也有很多的优点,例如:

  1. 语法简洁,更加语义化
  2. 基于标准 Promise 实现,支持 async/await
  3. 同构方便

文档:

  • fetch github
  • 一篇学习博客

使用介绍

因为 fetch 是原生自带的,所以无需安装,直接使用

API介绍

关于 fetch 相关的API 与 axios 相比就少了很多:

fetch(url [, options])

说明:

url:请求的url

options:可选项,可配置字段如下

 {method: "POST", // 请求方法,默认为GETbody: JSON.stringify(data), // HTTP 请求bodyheaders: { // headers 定制,默认为{}"Content-Type": "application/json"},credentials: "same-origin" // 认证字段,三种取值,默认是 "omit"
// `"omit"` - 不要在请求中包含身份验证凭据(例如cookie)
// `"same-origin"` - 在对同一站点的请求中包含凭据
// `"include"` - 在对所有站点的请求中包含凭据
}

请求返回的数据介绍:

{status: 200 , // HTTP 状态码(100–599)statusText: "ok" // 状态码对应的文本ok:True, // 如果状态码是 2xx 则为True,布尔值headers: {} // 响应头url: "" // 请求url
}// 关于获取到的数据,有几种方式获取到
text() // 将response 结果 作为 text 接收
json() // 将response 结果 经过 JSON.parse(responseText) 后接收
blob() // 将 response 结果 作为 Blob 接收
arrayBuffer() // 将 response 结果 作为 ArrayBuffer 接收
formData() - // 将 response 结果 作为 FormData 接收 ,可直接作为另外一个请求的formData

Example

注意点:当服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject,所以下面的代码(大家可以试试),即使是400/500的话,也会走到response那一步,而不是直接走到error(大家可以尝试一下),简单来说,只要服务器响应了,就是response,然后再获取数据

fetch(`/api1/search/users2?q=${keyWord}`).then(response => {console.log('联系服务器成功了');return response.json()},error => {console.log('联系服务器失败了',error);return new Promise(()=>{})}).then(response => {console.log('获取数据成功了',response);},error => {console.log('获取数据失败了',error);})

GET请求:

fetch(url).then(function(response) {return response.json()}).then(function(data) {console.log(data)}).catch(function(e) {console.log(e)});// 简化版
const response= await fetch(url)
const data = await response.json()

POST请求:

fetch(url, {method: "POST",body: JSON.stringify(data),headers: {"Content-Type": "application/json"},credentials: "same-origin"
}).then(function(response) {response.status     //=> number 100–599response.statusText //=> Stringresponse.headers    //=> Headersresponse.url        //=> Stringreturn response.text()
}, function(error) {error.message //=> String
})

总结

虽然国外很多新的库都默认使用了 Fetch,但是吧,我们平时开发使用较多的还是axios,自己封装一个请求js,根据不同的请求方法进行响应的请求,统一进行请求的默认设置、异常捕获与错误处理

React ajax 发送请求(六)相关推荐

  1. JQ中使用FormData+Ajax发送请求及使用express接收处理FormData数据

    JQ中使用FormData+Ajax发送请求及使用express接收处理FormData数据 最近写大创项目的时候,要做登录功能,考虑到之后还需要上传头像图片,因此决定使用FormData发送表单请求 ...

  2. Django Ajax发送请求使用方法

    首先需要引入Jquery这个库 其次: 需要引入csrf_token 原因是因为django 表单认证需要csrf认证 最后,就是正常执行ajax发送请求 示例代码如下: <script src ...

  3. jQuery里如何使用ajax发送请求

    回到文章总目录 本篇文章介绍的是在jQuery里如何使用ajax发送请求 jquery里面的单纯的get请求和单纯的post请求比较简洁的,也比较简易 jquery里面ajax通用方法(自定义个化强) ...

  4. AJAX,SpringMVC,拦截器(Ajax发送请求 经过SpringMVC拦截器重定向其他页面失败)

    Ajax发送请求 经过SpringMVC拦截器重定向其他页面失败 借鉴出处 Ajax是通过异步请求后台,获取数据,局部刷新页面,因此,即使后台进行页面跳转的编码,前台请求完毕以后,只会执行ajax的回 ...

  5. js采用ajax发送请求获取数据(实例操作)

    来,案例之前,容我分享一下js如何发送请求. 原生js发送请求: let xhr= new XMLHttpRequest(); // methods:GET/POST请求方式等,url:请求地址,tr ...

  6. JS中的Ajax发送请求获取数据流程

    前言: JS两个常用的请求方法 [XMLHttpRequest() .fetch()] XMLHttpRequest() 的使用方法大致可以分为四步: 1.创建XMLHttpRequest的对象成员 ...

  7. $.ajax 发送请求,JavaScript之Ajax-2 Ajax(使用Ajax发送get请求、使用Ajax发送post请求)

    一.使用Ajax发送get请求 发送异步请求的步骤 - 获取Ajax对象:获取 XMLHttpRequest对象实例 - 创建请求:调用XMLHTTPRequest对象的open方法 - 设置回调函数 ...

  8. 超级详细Ajax发送请求(接受提示信息或者返回参数)

    Ajax 在网页开发中必不可少,经常遇到,这里我写一下开发过程中比较常用的技术. 开发重点注意: 1.用户体验 2.程序性能.安全.可维护性.等等 // 提交数据到后台处理 $.ajax({url: ...

  9. ajax发送请求和数据返回,Ajax发送和接收请求

    首先Ajax的不刷新页面提交数据 基本上浏览器能接收的信息,Ajax都可以接收,ex:字符串,html标签,css标签,xml格式内容,json格式内容等等..... // IE浏览器 if(Acti ...

最新文章

  1. python将二维列表内容写入和读取.txt文件
  2. 关于strutsdemo实例的理解
  3. Apache Ant安装 验证
  4. cisco routemap 能在出接口调用吗_潍坊驰燃一号燃料能不能合法在家经营,手续好办吗?...
  5. ASP.NET 2.0 中的新增服务、控件与功能概述(四)
  6. Git 2.29.2 64位安装包
  7. 深度学习之图像分类(二十一)-- MLP-Mixer网络详解
  8. python123随机密码生成器_python密码生成器的3种方法
  9. 一加手机怎么root权限_一加手机的两种ROOT权限获取教程详解
  10. BS版的U8物料查询系统
  11. python抢点_零基础SQL小白入门学习路线与书单
  12. Unity 异常记录日志功能
  13. sqrt函数实现(涉及3D游戏引擎源码)
  14. 超实用后台UI模板有这些就够了!(一)
  15. WIN10本地搭建APACHE+PHP运行环境
  16. 笔记 | gamma分布
  17. IEEE文献免费下载方法
  18. STM32的串口传输文件和点阵汉字的字模读取与显示
  19. everything使用经验总结——待续
  20. PMBOK泛读(第十一章) - 项目风险管理

热门文章

  1. 华为教你如何做好大型项目
  2. 计算机毕业设计Java学生实验报告管理系统(源码+系统+mysql数据库+lw文档)
  3. 【SDCC 2016·杭州站】9月23日互联网应用架构实战专场精彩回顾
  4. PHP公众号页面打开很慢,浏览器打开网页很慢要怎么办?
  5. 杰里之Airpods Pro ANC效果】【篇】
  6. linux美国华盛顿时间,centos系统时间与硬件时间不一致
  7. SteamVR 场景重置
  8. 操作系统是中断驱动的
  9. 蓝牙解锁(AutoLock) for mac--蓝牙WiFi解锁工具
  10. hexo同时在github和gitcafe搭建个人博客