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 相关文章推荐
JavaScript 函数调用规则
Sep 14 Javascript
js实现在文本框光标处添加字符的方法介绍
Nov 24 Javascript
Vue原理剖析 实现双向绑定MVVM
May 03 Javascript
Bootstrap Table使用整理(五)之分页组合查询
Jun 09 Javascript
Three.js利用dat.GUI如何简化试验流程详解
Sep 26 Javascript
Vue 仿QQ左滑删除组件功能
Mar 12 Javascript
JS尾递归的实现方法及代码优化技巧
Jan 19 Javascript
vue cli 3.x 项目部署到 github pages的方法
Apr 17 Javascript
用vscode开发vue应用的方法步骤
May 06 Javascript
详解微信UnionID作用
May 15 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 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递归遍历多维数组的方法
2015/04/18 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
php工具型代码之印章抠图
2018/07/18 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
列举Python中吸引人的一些特性
2015/04/09 Python
python tkinter canvas使用实例
2019/11/04 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
python安装sklearn模块的方法详解
2020/11/28 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
我的求职择业计划书
2014/04/04 职场文书
护士找工作求职信
2014/07/02 职场文书
体育专业求职信
2014/07/16 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python