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 相关文章推荐
非常好用的JsonToString 方法 简单实例
Jul 18 Javascript
父页面显示遮罩层弹出半透明状态的dialog
Mar 04 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
Nov 10 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
Jun 07 Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 Javascript
很棒的js Tab选项卡切换效果
Aug 30 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
Sep 16 Javascript
jQuery插件WebUploader实现文件上传
Nov 07 Javascript
微信小程序 scroll-view实现锚点滑动的示例
Dec 06 Javascript
JS中call和apply函数用法实例分析
Jun 20 Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 Javascript
JS数据类型STRING使用实例解析
Dec 18 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获取网站域名和地址的代码
2008/08/17 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
用javascript控制iframe滚动的代码
2007/04/10 Javascript
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
微信小程序开发探究
2016/12/27 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python一键去抖音视频水印工具
2018/09/14 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
python使用建议与技巧分享(二)
2020/08/17 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
文秘专业自荐信
2013/10/14 职场文书
体育专业学生自我评价范文
2014/01/17 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
河童之夏观后感
2015/06/11 职场文书
歌咏比赛主持词
2015/06/29 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书