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 相关文章推荐
用js实现控制内容的向上向下滚动效果
Jun 26 Javascript
Javascript 类与静态类的实现(续)
Apr 02 Javascript
JQuery上传插件Uploadify使用详解及错误处理
Apr 27 Javascript
深入理解JavaScript系列(13) This? Yes,this!
Jan 18 Javascript
jQuery预加载图片常用方法
Jun 15 Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 Javascript
JavaScript编程中布尔对象的基本使用
Oct 25 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
May 23 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
懒加载实现的分页&&网站footer自适应
Dec 21 Javascript
详解能在多种前端框架下使用的表格控件
Jan 11 Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
python实现线程池的方法
2015/06/30 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
浅谈Python type的使用
2019/11/19 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
意大利奢侈品网站:Italist
2016/08/23 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
请说出以下代码输出什么
2013/08/30 面试题
体育馆的标语
2014/06/24 职场文书
前台接待岗位职责
2015/02/03 职场文书
2015年副班长工作总结
2015/05/15 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
公司员工管理制度
2015/08/04 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技