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实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
jquery动画效果学习笔记(8种效果)
Nov 13 Javascript
AngularJS中的Directive实现延迟加载
Jan 25 Javascript
javascript判断图片是否加载完成的方法推荐
May 13 Javascript
jQuery组件easyui基本布局实现代码
Aug 25 Javascript
JS数组返回去重后数据的方法解析
Jan 03 Javascript
AngularJS实现的锚点楼层跳转功能示例
Jan 02 Javascript
JS中touchstart事件与click事件冲突的解决方法
Mar 12 Javascript
JavaScript常见JSON操作实例分析
Aug 08 Javascript
微信小程序云开发之使用云函数
May 17 Javascript
利用Vue实现一个markdown编辑器实例代码
May 19 Javascript
如何基于jQuery实现五角星评分
Sep 02 jQuery
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中10个不常见却非常有用的函数
2010/03/21 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php mysql 封装类实例代码
2016/09/18 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
Python用Jira库来操作Jira
2020/12/28 Python
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
秘书岗位职责
2013/11/18 职场文书
实习单位接收函
2014/01/11 职场文书
函授自我鉴定范文
2014/02/06 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
社区科普工作方案
2014/06/03 职场文书
党的作风建设心得体会
2014/10/22 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
详解thinkphp的Auth类认证
2021/05/28 PHP
Nebula Graph解决风控业务实践
2022/03/31 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL