前言

  • 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习

  • 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所偏差,在学习中如果有错会及时修改内容,也欢迎万能的朋友们批评指出,谢谢

  • 文章第一版出自简书,如果出现图片或页面显示问题,烦请转至 简书 查看 也希望喜欢的朋友可以点赞,谢谢

网路请求


  • 在开发中,从网络上加载数据一直是重点和难点,尤其是在做相应的细节优化方面,在React Native 中通常是用哪种方式加载网络数据呢?

    • React Native 中通常是通过 Ajax 从服务器获取数据,在 componentDidMount 方法中创建 Ajex 请求,等到请求成功,再用 this.setState 方法重新渲染UI

什么是 fetch


  • fetch 目前还不是 W3C 规范,是由 whatag 负责研发。与 Ajax 不同的是,它的 API 不是事件机制,而是采用目前流行的 Promise(MDN Promise) 方式处理

  • 格式:

	fetch(url, init)
.then((response) => { // 数据解析方式
})
.then((responseData) => { // 获取到的数据处理
})
.catch((error) => { // 错误处理
})
.done();
  • 上面的示例中的 init 是一个对象,他里面包含了:

    • method:请求方式(GET、POST、PUT等)。
    • headers:需要用到 Headers 对象使用这个参数。
    • body:需要发送的数据
    • mode:跨域设置(cors, no-cors, same-origin)
    • cache:缓存选项(default, no-store, reload, no-cache, force-cache, or only-if-cached)

译注:

  • body:不可传对象,用JSON.stringify({...})也不可以,在jQuery 中会自动将对象封装成 formData 形式,fetch不会。
  • mode属性控制师傅跨域,其中 same-origin(同源请求,跨域会报error)、no-cors(默认,可以请求其它域的资源,不能访问response内的属性)和 cros(允许跨域,可以获取第三方数据,必要条件是访问的服务允许跨域访问)。
  • 使用 fetch 需要注意浏览器版本,但 React-Native 则不需要考虑。
  • response 对象可以有如下几种解析方式

    • arrayBuffer()
    • json()
    • text()
    • blob()
    • formData()
  • 下面是一个最基本的请求,只传入一个参数,默认为 GET 方式请求


fetch(url)
.then((response) => response.json()) // json方式解析,如果是text就是 response.text()
.then((responseData) => { // 获取到的数据处理
})
.catch((error) => { // 错误处理
})
.done();
  • 针对表单提交的请求,我们通常采用 POST 的方式。

方式一:


fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
body:"key1=value&key2=value…&keyN=value"
})
.then((response) => { // 数据解析方式
})
.then((responseData) => { // 获取到的数据处理
})
.catch((error) => { // 错误处理
})
.done();
  • JQuery 中,传入对象框架会自动封装成 formData 的形式,但是在 fetch 中没有这个功能,所以我们需要自己初始化一个 FormData 直接传给 body (补充:FormData也可以传递字节流实现上传图片功能)

方式二:

	let formData = new FormData();
formData.append("参数", "值");
formData.append("参数", "值"); fetch(url, {
method:'POST,
headers:{},
body:formData,
}).then((response)=>{
if (response.ok) {
return response.json();
}
}).then((json)=>{
alert(JSON.stringify(json));
}).catch.((error)=>{
console.error(error);
})

译注:

  • application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
  • Fetch 跨域请求的时候默认是不带 cookie 的,如果需要进行设置 credentials:'include'。

获取 HTTP 头信息


	console.log(response.headers.get('Content-Type'));
...
console.log(response.headers.get('Date'));

综合实例


译注:

  • 下面内容整理自 React-Native 中文网

其他可用网路库


  • React Native 中已经内置了 XMLHttpRequest API,一些基于 XMLHttpRequest 封装的第三方库也可以使用(如:axios、frisbee)但不能使用 jQuery,因为 jQuery 中还使用了很多浏览器才有而RN中没有的东西

    	var request = new XMLHttpRequest();
    request.onreadystatechange = (e) => {
    if (request.readyState != 4) {
    return;
    } if (request.status === 200) {
    console.log('success', request.responseText);
    } else {
    console.warn('error');
    }
    } request.open('GET', 'https://mywebsite.com/endpoint/');
    request.send();
  • 注意:由于安全机制与网页环境有所不同:在应用中你可以访问任何网站,没有跨域的限制

WebSocket

  • React Native 还支持 WebSocket,这种协议可以在单个TCP连接上提供全双工的通信信道

    	var ws = new WebSocket('ws://host.com/path');
    
    	ws.onopen = () => {
    // 打开一个连接
    ws.send('something'); // 发送一个消息
    }; ws.onmessage = (e) => {
    // 接收到了一个消息
    console.log(e.data);
    }; ws.onerror = (e) => {
    // 发生了一个错误
    console.log(e.message);
    }; ws.onclose = (e) => {
    // 连接被关闭了
    console.log(e.code, e.reason);
    };

React-Native 之 网络请求 fetch的更多相关文章

  1. React Native 之 网络请求

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  2. React Native中的网络请求fetch和简单封装

    React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...

  3. react native 之异步请求

    第一章 异步请求  fetch的运用 在react native  中异步请求一般用fetch这个方法, fetch的格式如下: const params ={ "charset" ...

  4. [React Native]获取网络状态

    使用React Native,可以使用NetInfo API获取手机当前的各个网络状态. componentWillMount() { NetInfo.fetch().done((status)=&g ...

  5. React Native 获取网络数据

    getMoviesFromApiAsync() { return fetch('http://facebook.github.io/react-native/movies.json') .then(( ...

  6. 在React Native中,使用fetch网络请求 实现get 和 post

    //在React Native中,使用fetch实现网络请求 /* fetch 是一个封装程度更高的网络API, 使用了Promise * Promise 是异步编程的一种解决方案 * Promise ...

  7. React Native 网络请求封装:使用Promise封装fetch请求

    最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...

  8. React Native探索(五)使用fetch进行网络请求

    相关文章 React Native探索系列 前言 React Native可以使用多种方式来请求网络,比如fetch.XMLHttpRequest以及基于它们封装的框架,fetch可以说是替代XMLH ...

  9. 在 JS 中使用 fetch 更加高效地进行网络请求

    在前端快速发展地过程中,为了契合更好的设计模式,产生了 fetch 框架,此文将简要介绍下 fetch 的基本使用. 我的源博客地址:http://blog.parryqiu.com/2016/03/ ...

随机推荐

  1. JDK源码分析(1)ArrayList

    JDK版本 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomA ...

  2. Linux下定时器

    http://unix8.net/linux%E4%B8%8B%E5%AE%9A%E6%97%B6%E5%99%A8.html 一. 基础知识 1.时间类型.Linux下常用的时间类型有4个:time ...

  3. [POI2010]KLO-Blocks——一道值得思考的题

    题目大意: 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操 ...

  4. javascript:window.location.replace 与 window.location.reload() 刷新页面的不同效果

    今天早上我发现一个问题,当一个网页的地址最后面是一个#时(比如:http://www.baidu.com/go.asp#), 执行:window.location.replace(window.loc ...

  5. 地址空间格局随机化ASLR

    Address space layout randomization(ASLR)是一种参与保护缓冲区溢出问题的一个计算机安全技术.是为了防止攻击者在内存中能够可靠地对跳转到特定利用函数.ASLR包括随 ...

  6. SQL Server 关于CROSS APPLY 和 OUTER APPLY应用

    先看看语法: <left_table_expression>  {cross|outer} apply<right_table_expression> 再让我们了解一下appl ...

  7. Python练习1

    一.linux,基于文件大小,创建时间,修改时间,文件内容,文件名称等进行查找汇总和输出 2019-01-04 只操作文本文件 #!/usr/bin/env python # -*- coding: ...

  8. Spark集群之yarn提交作业优化案例

    Spark集群之yarn提交作业优化案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.启动Hadoop集群 1>.自定义批量管理脚本 [yinzhengjie@s101 ...

  9. vue切换路由页面内容没有重载

    项目中遇到这样一个问题: 在一个地方填了一个申请的表单,需要在另一个页面的列表上显示出来这条申请的数据,但是由于vue的缓存,在切换路由时列表上并没有及时更新数据,解决方法如下: vue路由切换时页面 ...

  10. Hadoop记录-MRv2(Yarn)运行机制

    1.MRv2结构—Yarn模式运行机制 Client---客户端提交任务 ResourceManager---资源管理 ---Scheduler调度器-资源分配Containers ----在Yarn ...