详解React native fetch遇到的坑


Posted in Javascript onAugust 30, 2018

最近在自学react native,学习过程中遇到了不少的坑,下面将针对登录这一功能来详细介绍一下以下遇到的两个问题。

1.在请求数据的时候,一般情况下我们会直接提交Content-type是json数据格式的请求。类似

fetch('https://mywebsite.com/endpoint/', {
 method: 'POST',
 headers: {
  'Accept': 'application/json',
  'Content-Type': 'application/json',
 },
 body: JSON.stringify({
  firstParam: 'yourValue',
  secondParam: 'yourOtherValue',
 })
})

当我开始请求登录接口的时候,发现上面的请求方法失效了,想了好多办法都不知道问题出在哪里,最后试了下抓包,才发现原来请求登录接口的时候,content-type是application/x-www-form-urlencode,于是我搜了下这方面的知识。我们在提交表单的时候,form表单参数中会有一个enctype的参数。enctype指定了HTTP请求的Content-Type。默认情况下,HTML的form表单的enctype=application/x-www-form-urlencoded。application/x-www-form-urlencoded是指表单的提交,并且将提交的数据进行urlencode。默认情况下,我们所有的表单提交都是通过这种默认的方式实现的。文档中是有记载的:

fetch('https://mywebsite.com/endpoint/', {
 method: 'POST',
 headers: {
  'Content-Type': 'application/x-www-form-urlencoded',
 },
 body: 'key1=value1&key2=value2'
}

2.登录成功后如何获取当headers里面的sessionid的问题。

详解React native fetch遇到的坑 

登录成功之后,我们可以打印出上面的response,若是需要取出上面的sessionid,我们可以采用下面的方法,写法可能比较low,但是可以达到目的

//获取sid
var headers = response.headers.get("set-cookie");
var header = headers.split(";");
var sessionid;
for(var index = 0; index < header.length; index++)
{
  if(header[index].indexOf("JSESSIONID") > -1){
    sessionid = header[index].split("=")[1];
  }
}
//保存
AsyncStorage.setItem('sessionid', sessionid);

3.登录成功之后,后台需要根据sessionid来判断登录状态。当请求的接口是必须登录之后才能获得数据的时候,就不能用传统的写法来请求了。javascript 使用fetch进行跨域请求时默认是不带cookie的,所以会造成 session失效。那所以在登录请求的时候需要加上credentials: ‘include'这个字段。

fetch(Api.checkLoginSecurity , {
  credentials: 'include',
  method: 'POST',
  headers:{
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: 'username='+ this.props.userName + '&password=' + this.userPassword
})

在需要登录后才能获取数据的接口也需要加上

fetch(url , {
  credentials: 'include',
  method: 'GET',
})

此处还要强调一下get请求和post请求,经别人提醒,发现虽然他写了个body= {*},让我误以为是用POST方式,其实body只是参数的字段,实际上用的还是GET请求,所以把POST改为GET(默认是GET,所以就不需要写method),因为GET无法在body里传参,也不需要header,直接把参数写在URL里,只有POST才是在body里传参。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
定义JavaScript二维数组采用定义数组的数组来实现
Dec 09 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
Aug 16 Javascript
基于Bootstrap实现城市三级联动
Nov 23 Javascript
Vue.js 表单控件操作小结
Mar 29 Javascript
Angular6中使用Swiper的方法示例
Jul 09 Javascript
Vue使用NPM方式搭建项目
Oct 25 Javascript
微信小程序错误this.setData报错及解决过程
Sep 18 Javascript
js实现双人五子棋小游戏
May 28 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
Nov 11 Javascript
element 动态合并表格的步骤
Dec 31 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 #Javascript
原生JS实现简单的倒计时功能示例
Aug 30 #Javascript
JavaScript fetch接口案例解析
Aug 30 #Javascript
vue组件表单数据回显验证及提交的实例代码
Aug 30 #Javascript
原生JS实现的简单小钟表功能示例
Aug 30 #Javascript
使用Node搭建reactSSR服务端渲染架构
Aug 30 #Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
Aug 29 #Javascript
You might like
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
php上传图片类及用法示例
2016/05/11 PHP
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
Jquery 实现grid绑定模板
2015/01/28 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
python3实现微型的web服务器
2019/09/03 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
青年文明号创建承诺
2014/03/31 职场文书
高中生家长寄语大全
2014/04/03 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
给市场的环保建议书
2014/05/14 职场文书
中国梦团日活动总结
2014/07/07 职场文书
企业宣传语大全
2015/07/13 职场文书
2016年情人节广告语
2016/01/28 职场文书
PL350与SW11的比较
2021/04/22 无线电
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android