React Native - 网络请求详解(使用XMLHttpRequest、Fetch请求数据)
作者:hangge | 2017-05-09 08:10
在 App 中,网络数据请求是必不可少的。React Native 提供了两种网络 API 供我们使用,下面分别进行介绍。
(2)使用样例
一、使用XMLHttpRequest方式请求
如果有做过 Web 开发,那么对 XMLHttpRequest 肯定很熟悉。而 React Native 对 XMLHttpRequest 的实现几乎和 Web 是一样的。
唯一不同的是:React Native 中的 XMLHttpRequest API 不存在跨域的限制,而是作为全局 API 实现的。
1,效果图
点击“获取数据”按钮后,通过 XMLHttpRequest 方式请求数据,并将得到的结果显示在页面上。
2,样例代码
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from 'react-native'; //默认应用的容器组件 class App extends Component { //构造函数 constructor(props) { super(props); this.state = { responseText: null }; } //渲染 render() { return ( <View style={styles.container}> <Text style={styles.item} onPress={this.doXMLHttpRequest.bind(this)}>获取数据</Text> <Text>{this.state.responseText}</Text> </View> ); } //使用XMLHttpRequest请求数据 doXMLHttpRequest(){ var request = new XMLHttpRequest(); request.onreadystatechange = (e) => { if (request.readyState !== 4) { return; } if (request.status === 200) { alert("请求成功!"); this.setState({responseText: request.responseText}) console.log(request.responseText); } else { alert("请求失败!"); } }; request.open('GET', 'https://httpbin.org/get'); request.send(); } } //样式定义 const styles = StyleSheet.create({ container:{ flex: 1, marginTop:25 }, item:{ margin:15, height:30, borderWidth:1, padding:6, borderColor:'#ddd', textAlign:'center' }, }); AppRegistry.registerComponent('ReactDemo', () => App);
二、使用Fetch方式请求
相对于 XMLHttpRequest 来说,fetch 是一个封装程度更高的网络 API,它已经通过了标准委员会并在 Chrome 中实现。 同样在 React Native 中,也默认实现了 Fetch。1,使用样例
这里实现一个同上面 XMLHttpRequest 请求同样功能的样例,只不过数据请求相关代码使用 Fetch 代替。import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from 'react-native'; //默认应用的容器组件 class App extends Component { //构造函数 constructor(props) { super(props); this.state = { responseText: null }; } //渲染 render() { return ( <View style={styles.container}> <Text style={styles.item} onPress={this.doFetch.bind(this)}>获取数据</Text> <Text>{this.state.responseText}</Text> </View> ); } //使用Fetch请求数据 doFetch(){ fetch('https://httpbin.org/get') .then(function(data){ return data.text(); }) .then((responseText) => { alert("请求成功!"); this.setState({responseText}) console.log(responseText); }) .catch((error) => { alert("请求失败!"); }); } } //样式定义 const styles = StyleSheet.create({ container:{ flex: 1, marginTop:25 }, item:{ margin:15, height:30, borderWidth:1, padding:6, borderColor:'#ddd', textAlign:'center' }, }); AppRegistry.registerComponent('ReactDemo', () => App);
2,对Fetch进行封装
(1)这里我们对 Fetch 进行一个封装,实现一个支持 POST 请求的简单 API。//带参数的POST请求 function postRequest(url, data, callback) { var opts = { method: 'POST', headers: { 'Accept': 'application/json' }, body: JSON.stringify(data) } fetch(url, opts) .then((resonse) => resonse.text()) .then((responseText) => { //将返回的JSON字符串转成JSON对象,并传递到回调方法中 callback(JSON.parse(responseText)); }); }
(2)使用样例
var data = {id:123, name:'hangge.com'}; postRequest('https://httpbin.org/post', data, function(result){ alert("请求成功!"); console.log(result); })
全部评论(0)