React Native 采用Fetch方式发送POST请求

本文主要介绍了详解react native 采用fetch方式发送跨域post请求,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

Fetch以后是趋势,势必要取代传统的Ajax,而且RN框架支持Fetch。下面仅做了一个跨域请求的例子,在本域请求是一样的,而且更简单一些。客户端环境用的是RN写的一个页面,也可以用浏览器的console控制台模拟。后端服务用的是NodeJs express框架。

React Native 采用Fetch方式发送POST请求

React Native 采用Fetch方式发送POST请求

1)Fetch请求

//发送Ajax请求  sendAjax(){   //POST方式,IP为本机IP   fetch("http://192.168.111.102:8085", {    method: "POST",    mode: "cors",    headers: {     "Content-Type": "application/x-www-form-urlencoded"    },    body: 'key=1'   }).then(function (res) {    console.log("fetch request ", JSON.stringify(res.ok));    if(res.ok){     res.json().then(function (json) {      console.info(json);      Alert.alert('提示','来自后台数据:名字'+json.name+'、年龄'+json.age,[{text: '确定', onPress: () => console.log('OK Pressed!')},]);     });    }else{     Alert.alert('提示','请求失败',[{text: '确定', onPress: () => console.log('OK Pressed!')},]);    }    }).catch(function (e) {    console.log("fetch fail");    Alert.alert('提示','系统错误',[{text: '确定', onPress: () => console.log('OK Pressed!')},]);   });  }

登录后复制

1、mode属性控制是否允许跨域。same-origin(同源请求)、no-cors(默认)和cros(允许跨域请求),第一种跨域求情会报error,第二种可以请求其他域的脚本、图片和其他资源,但是不能访问response里面的属性,第三种可以获取第三方数据,前提是所访问的服务允许跨域访问。否则,会出现如下错误:

React Native 采用Fetch方式发送POST请求

2、Fetch请求后台时,返回时一个Promise对象。对象支持解析返回数据的方法有:arrayBuffer()、blob()、formData()、json()、text()。

3、Body传入参数,注意!注意!注意!重要的事情说三次,只能传啊a=1&b=2…这种参数形式,不可传对象{a:1,b:2,…},用JSON.stringify({a:1,b:2,…})也不行。在jquery中,传入对象框架会自动封装成formData的形式,fetch没有这个功能。

4、使用时请注意浏览器版本,低版本不支持此对象。RN是可以用的

2)Nodejs express框架开启允许跨域请求:

//设置跨域访问 app.all('*', function(req, res, next) {  res.header("Access-Control-Allow-Origin", "*");  res.header("Access-Control-Allow-Headers", "X-Requested-With");  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");  res.header("X-Powered-By",' 3.2.1');  res.header("Content-Type", "application/json;charset=utf-8");  next(); });

登录后复制

3)Nodejs express框架开启处理POST数据功能,默认POST请求的参数是在请求体里面,用res.query是获取不到的,为{};需要使用res.body获取,前提是要在express框架里面开启body解析功能,否则显示undefined。

var express = require('express'); //Post方式请求参数放在请求体里面,需引用body-parser解析body var bodyParser = require("body-parser"); var app = express();  // 引用 app.use(bodyParser.urlencoded({ extended: false }));

登录后复制

4)支持jsonp方式跨域访问,开启跨域访问后用传统的jsonp方式请求时,会报错。因为jsonp请求需要返回一个callback包裹的数据,否则解析出错。此处有一个坑,用$.ajax({method:’POST’,dataType:’jsonp’})方式请求时,依然发送的是GET请求。

//json数据 var data = { "name": "Test", "age": "19" };  app.get('/', function(req, res) {  console.log('get..........');  console.log(req.query);  if (req.query && req.query.callback) {   var str = req.query.callback + "(" + JSON.stringify(data) + ")"; //jsonp   console.log('jsonp: '+str);   res.end(str);  }else{   console.log('json: '+JSON.stringify(data));   res.end(JSON.stringify(data));  } });

登录后复制

5)完整代码:

1、RN前端

 /** * Created by linyufeng on 2016/8/22. */import React, { Component } from 'react';import { AppRegistry, StyleSheet, Text, TouchableHighlight, Alert, View} from 'react-native';class HelloWorld extends Component {//发送Ajax请求 sendAjax(){  //POST方式  fetch("http://192.168.111.102:8085", {   method: "POST",   mode: "cors",   headers: {    "Content-Type": "application/x-www-form-urlencoded"   },   body: 'key=1'  }).then(function (res) {   console.log("fetch request ", JSON.stringify(res.ok));   if(res.ok){    res.json().then(function (json) {     console.info(json);     Alert.alert('提示','来自后台数据:名字'+json.name+'、年龄'+json.age,[{text: '确定', onPress: () => console.log('OK Pressed!')},]);    });   }else{    Alert.alert('提示','请求失败',[{text: '确定', onPress: () => console.log('OK Pressed!')},]);   }  }).catch(function (e) {   console.log("fetch fail");   Alert.alert('提示','系统错误',[{text: '确定', onPress: () => console.log('OK Pressed!')},]);  }); } render() {  return (                  点击发送Ajax请求              ); }}const styles = StyleSheet.create({ container: {  flex: 1,  justifyContent: 'center',  alignItems: 'center',  backgroundColor: '#F5FCFF', }, wrapper: {  borderRadius: 5,  marginBottom: 5, }, button: {  backgroundColor: '#eeeeee',  padding: 10, },});AppRegistry.registerComponent('HelloWorld', () => HelloWorld);

登录后复制

2、NodeJs

 /** * Created by linyufeng on 2016/8/22. */var express = require('express');//Post方式请求参数放在请求体里面,需引用body-parser解析bodyvar bodyParser = require("body-parser");var app = express();// 引用app.use(bodyParser.urlencoded({ extended: false }));//设置跨域访问app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By",' 3.2.1'); res.header("Content-Type", "application/json;charset=utf-8"); next();});//json数据var data = { "name": "Test", "age": "19" };app.get('/', function(req, res) { console.log('get..........'); console.log(req.query); if (req.query && req.query.callback) {  var str = req.query.callback + "(" + JSON.stringify(data) + ")"; //jsonp   console.log('jsonp: '+str);  res.end(str); }else{  console.log('json: '+JSON.stringify(data));  res.end(JSON.stringify(data)); }});app.post('/', function(req, res) { console.log('post............'); console.log(req.body); console.log('json: '+JSON.stringify(data)); res.end(JSON.stringify(data));});app.listen(8085, function () { console.log('Listening on port 8085...');});

登录后复制

相关推荐:

实例讲解Ajax post请求跳转页面

vue resource post请求时遇到的问题解决办法

php中curl get post请求解析

以上就是React Native 采用Fetch方式发送POST请求的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2790711.html

(0)
上一篇 2025年3月8日 19:00:37
下一篇 2025年3月5日 03:19:18

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • React Native跨域资源加载出错如何解决

    本文主要为大家分享一篇react native 真机断点调试+跨域资源加载出错问题的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。 写在前面 闲来无事,折腾了一下React Native,相比之…

    2025年3月8日 编程技术
    200
  • React Native地址挑选器功能实现方法

    本文主要为大家详细介绍了react native仿地址挑选器功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 产品经理:“你明白吧,这里向右划可以出菜单,然后需要一个闪烁的动画,还有,我想这个tab可以拉下来,你懂…

    2025年3月8日
    200
  • React Native竖向轮播组件的封装详解

    本文主要介绍了react native 通告消息竖向轮播组件的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 本文实例为大家分享了React Native通告消息竖向轮播组件的封装代码,供大家参考,具体内容如下 …

    2025年3月8日
    200
  • store优化React组件的方法详解

    本文主要介绍了使用store来优化react组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 在使用 React 编写组件的时候,我们常常会碰到两个不同的组件之间需要共享状态情况,…

    编程技术 2025年3月8日
    200
  • 构建React组件最全方法

    我非常喜欢使用react,因为我觉得它最大优点就是足够简单。 在简单和容易之间还是存在区别 的,我的意思是react也很简单。当然你需要些时间来了解它,当你掌握其核心内容后,其他的事都是水到渠成的了。下文将介绍比较难的部分。 耦合&…

    编程技术 2025年3月8日
    200
  • React 和Webpack构建打包优化实例详解

    本文主要介绍了浅谈react + webpack 构建打包优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 使用 babel-react-optimize 对 React 代码进行优化 检…

    2025年3月8日
    200
  • React根据宽度自适应高度实例分享

    有时对于响应式布局,我们需要根据组件的宽度自适应高度。css无法实现这种动态变化,传统是用jquery实现。本文主要介绍了react根据宽度自适应高度的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希…

    2025年3月8日
    200
  • vue中使用express和fetch获取本地json文件技巧分享

    本文主要介绍了详解vue中使用express+fetch获取本地json文件,非常具有实用价值,需要的朋友可以参考下,希望能帮助到大家。 自己在做个vue小demo的时候,想模拟从服务器获取json数据的过程,一开始的想法是使用fetch直…

    2025年3月8日
    200
  • React利用相对于根目录进行引用组件实例详解

    本文主要给大家介绍了关于react如何使用相对于根目录进行引用组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧,希望能帮助到大家。 在对自己开发的组件中经常…

    编程技术 2025年3月8日
    200
  • React Native中RefreshContorl下拉刷新教程

    我们知道app中都有下拉加载,在react native中也有类似的控件,本文主要介绍了react native中的refreshcontorl下拉刷新使用,希望能帮助到大家。 一、属性方法 (1) onRefresh function 在…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论