React Native探索(五)使用fetch进行网络请求

前言

React Native可以使用多种方式来进行网络请求,比如fetch、XMLHttpRequest以及基于它们封装的框架,fetch可以说是替代XMLHttpRequest的产物,这一节我们就来学习fetch的基本用法。

1.get请求

fetch API是基于 Promise 设计的,因此了解Promise也是有必要的,推荐阅读MDN Promise教程 。

get请求访问淘宝IP库

我们先从最基础的get请求开始,get请求的地址为淘宝IP地址库,里面有访问接口的说明。请求代码如下所示。


fetch(‘http://ip.taobao.com/service/getIpInfo.php?ip=59.108.51.32‘, {

method: ‘GET‘,

headers: {

‘Content-Type‘: ‘application/json‘

}

}).then((response) => {//1

console.log(response);

}).catch((err) => {//2

console.error(err);

});

其中method用于定义请求的方法,这里不用写method也可以,fetch默认的method就是GET。fetch方法会返回一个Promise对象,这个Promise对象中包含了响应数据response,也就是注释1处的response参数。在注释1处调用then方法将response打印在控制台Console中,then方法同样也会返回Promise对象,Promise对象可以进行链式调用,这样就可以通过多次调用then方法对响应数据进行处理。在注释2处通过catch方法来处理请求网络错误的情况。 除了上面这一种写法,我们还可以使用Request,如下所示。


let request = new Request(‘http://liuwangshu.cn‘, {

method: ‘GET‘,

headers: ({

‘Content-Type‘: ‘application/json‘

})

});

fetch(request).then((response) => {

console.log(response);

}).catch((err) => {

console.error(err);

});

我们先创建了Request对象,并对它进行设置,最后交给fetch处理。 为了验证fetch的get请求,需要添加触发get请求的代码逻辑,如下所示。


import React, {Component} from ‘react‘;

import {AppRegistry, View, Text, StyleSheet, TouchableHighlight} from ‘react-native‘;

class Fetch extends Component {

render() {

return (

<View style={styles.container}>

<TouchableHighlight

underlayColor=‘rgb(210,260,260)‘

style={{padding: 10, marginTop: 10, borderRadius: 5,}}

onPress={this.get}

>

<Text >get请求</Text>

</TouchableHighlight>

</View>

);

}

get() {

fetch(‘http://ip.taobao.com/service/getIpInfo.php?ip=59.108.51.32‘, {

method: ‘GET‘,

}).then((response) => {

console.log(response);//1

}).catch((err) => {//2

console.error(err);

});

}

}

const styles = StyleSheet.create({

container: {

alignItems: ‘center‘,

}

});

AppRegistry.registerComponent(‘FetchSample‘, () => Fetch);

这里添加了一个TouchableHighlight,并定义了它的点击事件,一旦点击就会触发get方法请求网络。运行程序点击“get请求”,这时在控制台Console中就会显示回调的Response对象的数据,它包含了响应状态(status)、头部信息(headers)、请求的url(url)、返回的数据等信息。这次请求的响应状态status为200,返回的数据是JSON格式的,用Charles抓包来查看返回的JSON,如下图所示。

Response对象解析

Response对象中包含了多种属性:

  • status (number) : HTTP请求的响应状态行。
  • statusText (String) : 服务器返回的状态报告。
  • ok (boolean) :如果返回200表示请求成功,则为true。
  • headers (Headers) : 返回头部信息。
  • url (String) :请求的地址。

Response对象还提供了多种方法:

  • formData():返回一个带有FormData的Promise。
  • json() :返回一个带有JSON对象的Promise。
  • text():返回一个带有文本的Promise。
  • clone() :复制一份response。
  • error():返回一个与网络相关的错误。
  • redirect():返回了一个可以重定向至某URL的response。
  • arrayBuffer():返回一个带有ArrayBuffer的Promise。
  • blob() : 返回一个带有Blob的Promise。

接下来对返回的Response进行简单的数据处理,如下所示。


get() {

fetch(‘http://ip.taobao.com/service/getIpInfo.php?ip=59.108.23.12‘, {

method: ‘GET‘,

headers: {

‘Content-Type‘: ‘application/json‘

}

}).then((response) => response.json())//1

.then((jsonData) => {//2

let country = jsonData.data.country;

let city = jsonData.data.city;

alert("country:" + country + "-------city:" + city);

});

}

访问淘宝IP地址库会返回JSON数据,因此在注释1处调用response的json方法,将response转换成一个带有JSON对象的Promise,也就是注释2处的jsonData。最后取出jsonData中数据并展示在Alert中,这里data是一个对象,如果它是一个对象数组我们可以这样获取它的数据:


let country=jsonData.data[0].country;

点击“get请求”,效果如下所示。

2.post请求

post请求的代码如下所示。


post() {

fetch(‘http://ip.taobao.com/service/getIpInfo.php‘, {

method: ‘POST‘,//1

headers: {

‘Content-Type‘: ‘application/json‘,

},

body: JSON.stringify({//2

‘ip‘: ‘59.108.23.12‘

})

}).then((response) => response.json())

.then((jsonData) => {

let country = jsonData.data.country;

let city = jsonData.data.city;

alert("country:" + country + "-------city:" + city);

});

}

在注释1处将method改为POST,在注释2处添加请求的body。与get请求类似,这里也添加一个触发事件来进行post请求,当点击“post请求”时,查看Charles抓包的请求的信息,如下图所示。

可以看到请求数据是一个GSON字符串,因为淘宝IP库并不支持此类型的POST请求,所以不会返回我们需要的地理信息数据安徽板面

3.简单封装fetch

如果每次请求网络都要设定method、headers、body等数据,同时还要多次调用then方法对返回数据进行处理,显然很麻烦,下面就对上面例子中的get和post请求做一个简单的封装。 首先创建一个FetchUtils.js,代码如下所示。


import React, {Component} from ‘react‘;

class FetchUtils extends React.Component {

static send(method, url, data, callback) {

let request;

if (method === ‘get‘) {

request = new Request(url, {

method: ‘GET‘,

headers: ({

‘Content-Type‘: ‘application/json‘

})

});

} else if (method === ‘post‘) {

request = new Request(url, {

method: ‘POST‘,

headers: ({

‘Content-Type‘: ‘application/json‘

}),

body: JSON.stringify(data)

});

}

fetch(request).then((response) => response.json())

.then((jsonData) => {

callback(jsonData);//1

});

}

}

module.exports = FetchUtils;

在FetchUtils中定义了send方法,对GET和POST请求做了区分处理,并在注释1处通过callback将响应数据response回调给调用者。 最后调用FetchUtils的send方法,分别进行GET和POST请求:


let FetchUtils=require(‘./FetchUtils‘);

...

sendGet() {

FetchUtils.send(‘get‘, ‘http://ip.taobao.com/service/getIpInfo.php?ip=59.108.23.16‘, ‘‘,

jsonData => {

let country = jsonData.data.country;

let city = jsonData.data.city;

alert("country:" + country + "-------city:" + city);

})

}

sendPost() {

FetchUtils.send(‘post‘, ‘http://ip.taobao.com/service/getIpInfo.php‘, {‘ip‘: ‘59.108.23.16‘},

jsonData => {

let country = jsonData.data.country;

let city = jsonData.data.city;

alert("country:" + country + "-------city:" + city);

})

}

这样我们使用Fetch访问网络时,只需要传入需要的参数,并对返回的jsonData 进行处理就可以了。

时间: 2024-11-25 15:48:35

React Native探索(五)使用fetch进行网络请求的相关文章

React Native(十五)&mdash;&mdash;RN中的分享功能

终于,终于,可以总结自己使用RN时的分享功能了-- 为什么呢?且听我慢慢道来吧: 从刚开始接触React Native(2017年9月中旬)就着手于分享功能,直到自己参与公司的rn项目开发中,再到现在几乎"竣工"的过程中,这一路的"艰辛"估计也只有自己能体会到了吧.其实自己并不喜欢抱怨,也不喜欢把负能量带给身边的朋友,因此在遇到问题后,都是竭尽全力的攻克它,也许会"废寝忘食",也许是"徒劳无功",即使中间道路实在太曲折,但庆幸

东方耀 手把手教React Native实战开发视频教程+源码笔记全集

课程序号标题 第0课0.手把手教React Native实战之开山篇_视频 第1课1.手把手教React Native实战之环境搭建_视频_Windows环境 第1课1.手把手教React Native实战之环境搭建[Mac真机]同时调试开发Android&IOS 第2课2.手把手教React Native实战之从React到RN 第3课3.手把手教React Native实战之flexbox布局(RN基础) 第4讲4.手把手教React Native实战之flexbox布局(伸缩属性) 第5讲

React Native专题-江清清

本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶相关讲解. 刚创建的React Native交流8群:533435865  欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 关于React Native各种疑难杂症,问题深坑总结方案请点击查看: Mac和Windows安装搭建React Native环境教程如下: Mac OS X版本:Mac OS X安装R

React Native学习(1):怎么快速学习一门新技术

React Native学习方法论 这是我技术公众号的第一篇文章,也是ReactNative系列文章的第一篇,对我的文章感兴趣的可以加我微信16230091进行关注. 本文表面上讲React Native(以下简称RN),实际上对于学习任何语言和系统都适用. 对于新技术的学习,分为两种,一种是语言,类似Swift.Objective-C.Java.ES6,另一种是系统,比如Android.iOS.前端. 1. 语言层面,如果你精通某一门语言,那么是可以很快切换到另一门语言的.这就是语言的相通性.

react native中如何往服务器上传网络图片

1 let common_url = 'http://192.168.1.1:8080/'; //服务器地址 2 let token = ''; //用户登陆后返回的token 3 /** 4 * 使用fetch实现图片上传 5 * @param {string} url 接口地址 6 * @param {JSON} params body的请求参数 7 * @return 返回Promise 8 */ 9 function uploadImage(url,params){ 10 return

fetch网络请求 get 和 post

//在React Native中,使用fetch实现网络请求 /* fetch 是一个封装程度更高的网络API, 使用了Promise* Promise 是异步编程的一种解决方案* Promise 对象代表一个异步操作,有三种状态:Pending(进行中) Resolved(已完成) Rejected(已失效)** Promise 实例生成以后,可以分别制定'完成' 和'失败'状态的回调函数,实现方式:链式调用方法** 语法:* fetch(参数)* .then(完成的回调函数)* .catch

[React Native] Passing data when changing routes

The way you make HTTP requests in React Native is with the Fetch API. In this video we'll talk about Fetch and how to work with promises. As we build application components, we will need to pass data along as we change routes and bring them into view

React Native电商项目实战混合APP开发 React Native实战 混合APP实战开发

React Native  和 angular+ionic 是目前网络上最火的混合APP开发语言,其功能强大能够开发出安卓和IOS程序! ------------------课程目录------------------ <React Native电商项目实战>├<01React Native初体验>│  ├01-React Native简介.mp4│  ├02-React Native环境搭建.mp4│  ├03-React Native初体验及其它环境搭建.mp4│  └04-R

React Native 网络请求封装:使用Promise封装fetch请求

React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRequest 是一个设计粗糙的 API,不符合职责分离的原则,配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise 友好.而Fetch 的出现就是为了解决 XHR 的问题,所以ReactNative官方推荐使用Fetch API.http://blog.csdn.net/withings/article/details/71331726 fet