详解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实现CheckBox的全选与取消全选的代码
Jul 20 Javascript
jQuery Study Notes学习笔记 (二)
Aug 04 Javascript
理解Javascript_13_执行模型详解
Oct 20 Javascript
Js 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
详细解密jsonp跨域请求
Apr 15 Javascript
jQuery+AJAX实现无刷新下拉加载更多
Jul 03 Javascript
详解javascript高级定时器
Dec 31 Javascript
浅谈js的html元素的父节点,子节点
Aug 06 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
微信小程序wepy框架笔记小结
Aug 08 Javascript
js控制随机数生成概率代码实例
Mar 21 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
深入浅出es6模板字符串
2017/08/26 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
vue动态子组件的两种实现方式
2019/09/01 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
python中reduce()函数的使用方法示例
2017/09/29 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
Python构建图像分类识别器的方法
2019/01/12 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
工会经费申请报告
2015/05/15 职场文书
会计实训总结范文
2015/08/03 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL