React Native 使用Fetch发送网络请求的示例代码


Posted in Javascript onDecember 02, 2017

我们在项目中经常会用到HTTP请求来访问网络,HTTP(HTTPS)请求通常分为"GET"、"PUT"、"POST"、"DELETE",如果不指定默认为GET请求。

在项目中我们常用到的一般为GET和POST两种请求方式,针对带参数的表单提交这类的请求,我们通常会使用POST的请求方式。

为了发出HTTP请求,我们需要使用到 React Native 提供的 Fetch API 来进行实现。要从任意地址获取内容的话,只需简单地将网址作为参数传递给fetch方法即可(fetch这个词本身也就是获取的意思

GET

如果你想要通过 GET 方法去请求数据并转化成 JSON,可以通过如下代码实现:

fetch('https://facebook.github.io/react-native/movies.json')
   .then((response) => response.json())
   .then((responseJson) => {
    return responseJson.movies;
   })
   .catch((error) => {
    console.error(error);
   });

通过上面的请求把返回的 Response 转化成 JSON Object,然后取出 JSON Object 里的 movies 字段。同时,如果发生 Error,如网络不通或访问连接错误等, 会被 .catch 。在正常的情况下,我们可以得到如下结果:

{
 "title": "The Basics - Networking",
 "description": "Your app fetched this from a remote endpoint!",
 "movies": [
  { "title": "Star Wars", "releaseYear": "1977"},
  { "title": "Back to the Future", "releaseYear": "1985"},
  { "title": "The Matrix", "releaseYear": "1999"},
  { "title": "Inception", "releaseYear": "2010"},
  { "title": "Interstellar", "releaseYear": "2014"}
 ]
}

POST(一)

当然,上面是最基本的 GET 请求,Fetch还有可选的第二个参数,可以用来定制HTTP请求一些参数。你可以指定Headers参数,或是指定使用POST方法,又或是提交数据等等:Fetch API 还支持自定义 Headers,更换 Method,添加 Body 等。

let url = "http://www.yousite.com/xxxx.ashx” 
let params = {"name":"admin","password":"admin"}; 
fetch(url, {
 method: 'POST',
 headers: {
  'Accept': 'application/json',
  'Content-Type': 'application/json',
 },
 body: JSON.stringify(params)
})

上面构建了一个基本的 POST 请求,添加了自己的 Headers:Accept和Content-Type,添加了 Body。

POST(二)

let url = "http://www.yousite.com/xxxx.ashx”; 
let params = "username=admin&password=admin”; 
fetch(url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: params,
}).then((response) => {
  if (response.ok) {
    return response.json();
  }
}).then((json) => {
  console.log(json)
}).catch((error) => {
  console.error(error);
});

POST(三)推荐

通过上面两种方法,我们还有一种方式可以发送POST请求,当然这种方式也是被推荐使用的。

如果你的服务器无法识别上面POST的数据格式,那么可以尝试传统的form格式,示例如下:

let REQUEST_URL = 'http://www.yousite.com/xxxx.ashx';

// `首先我们需要自己创建一个FormData,来存请求参数`

let parameters = new FormData();
parameters.append("mt", "30013");
parameters.append("pg", "1");
parameters.append('ps', '20');


fetch(REQUEST_URL, {
  method: 'POST',
  body: parameters
}).then(
  (result) => {
    if (result.ok) {
      console.log(result)
      result.json().then(
        (obj) => {
          console.log(obj)
        }
      )
    }
  }
).catch((error) => {
  console.log(error)
  Alert.alert('Error')
})

推荐这种方法的好处还有一个,就是可以在FormData中直接传递字节流实现上传图片的功能,代码如下:

uploadImage(){ 
 let formData = new FormData(); 
 let file = {uri: uri, type: 'multipart/form-data', name: 'a.jpg'}; 

 formData.append("images",file); 

 fetch(url,{ 
  method:'POST', 
  headers:{ 
    'Content-Type':'multipart/form-data', 
  }, 
  body:formData, 
 }) 
 .then((response) => response.text() ) 
 .then((responseData)=>{ 

  console.log('responseData',responseData); 
 }) 
 .catch((error)=>{console.error('error',error)}); 

}

处理服务器的响应数据

上面的例子演示了如何发起请求。很多情况下,你还需要处理服务器回复的数据。
网络请求天然是一种异步操作,Fetch 方法会返回一个Promise,这种模式可以简化异步风格的代码,关于Promise,请参考:Promise

处理服务器返回的数据,我们已经在上面第二种和第三种的POST请求中实现了数据的处理。具体代码参考上面的实现代码。

默认情况下,iOS会阻止所有非https的请求。如果你请求的接口是http协议,那么首先需要添加一个App Transport Security的例外。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
锋利的jQuery 第三章章节总结的例子
Mar 23 Javascript
JavaScript和JQuery实用代码片段(一)
Apr 07 Javascript
JavaScript 面向对象的 私有成员和公开成员
May 13 Javascript
qTip2 精致的基于jQuery提示信息插件
Feb 17 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
May 03 Javascript
js+csss实现的一个带复选框的下拉框
Sep 29 Javascript
JavaScript实现无穷滚动加载数据
May 06 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
Oct 08 Javascript
JavaScript实现省市联动过程中bug的解决方法
Dec 04 Javascript
Element input树型下拉框的实现代码
Dec 21 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
Jan 18 Javascript
vue实现购物车小案例
Sep 27 Javascript
vue微信分享 vue实现当前页面分享其他页面
Dec 02 #Javascript
Vue按需加载的具体实现
Dec 02 #Javascript
使用Vue完成一个简单的todolist的方法
Dec 01 #Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 #jQuery
如何让你的JS代码更好看易读
Dec 01 #Javascript
javascript中new Array()和var arr=[]用法区别
Dec 01 #Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
Dec 01 #Javascript
You might like
PHP读取XML值的代码(推荐)
2011/01/01 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP数组相关函数汇总
2015/03/24 PHP
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
python中self原理实例分析
2015/04/30 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
django框架ModelForm组件用法详解
2019/12/11 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
linux面试相关问题
2012/08/11 面试题
创立科技Java面试题
2015/11/29 面试题
书香校园建设方案
2014/05/02 职场文书
入党综合考察材料
2014/06/02 职场文书
课外活动总结范文
2014/07/09 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
干部作风建设工作总结
2014/10/29 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
以权谋私检举信范文
2015/03/02 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书