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脚本代码跑起来。
Jan 09 Javascript
jQuery EasyUI API 中文文档 - Form表单
Oct 06 Javascript
JS随即打乱数组实现代码
Dec 03 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
May 27 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
JavaScript中的连字符详解
Nov 28 Javascript
IE中的File域无法清空使用jQuery重设File域
Apr 24 Javascript
jQuery实现提示密码强度的代码
Jul 15 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
vue2.0实现导航菜单切换效果
May 08 Javascript
Node+OCR实现图像文字识别功能
Nov 26 Javascript
JavaScript实现模态对话框实例
Jan 13 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
通过html表格发电子邮件
2006/10/09 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
详解python发送各类邮件的主要方法
2016/12/22 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
python ftplib模块使用代码实例
2019/12/31 Python
python sorted函数原理解析及练习
2020/02/10 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
教师求职自荐信
2014/03/09 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
西岭雪山导游词
2015/02/06 职场文书
教师见习总结范文
2015/06/23 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python