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 相关文章推荐
jQuery1.4.2与老版本json格式兼容的解决方法
Feb 12 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
Sep 02 Javascript
jQuery如何获取动态添加的元素
Jun 24 Javascript
Jquery和Js获得元素标签名称的方法总结
Oct 08 Javascript
jQuery插件WebUploader实现文件上传
Nov 07 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
Mar 26 Javascript
jQuery实现点击关注和取消功能
Jul 03 jQuery
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
CKEditor4配置与开发详细中文说明文档
Oct 08 Javascript
vue-cli中vue本地实现跨域调试接口
Jan 16 Javascript
bootstrap table实现横向合并与纵向合并
Jul 18 Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 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
德生9700DX电路分析
2021/03/02 无线电
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
详解在React里使用"Vuex"
2018/04/02 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
Python常用模块用法分析
2014/09/08 Python
python实现在控制台输入密码不显示的方法
2015/07/02 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
python正则分析nginx的访问日志
2017/01/17 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
学校联谊协议书
2014/09/16 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL