详解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 相关文章推荐
jQuery中prevUntil()方法用法实例
Jan 08 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
Nov 19 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
Nov 24 Javascript
jQuery验证表单格式的使用方法
Jan 10 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
Aug 01 jQuery
JavaScript实现树的遍历算法示例【广度优先与深度优先】
Oct 26 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
Mar 13 Javascript
Vue渲染过程浅析
Mar 14 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
JS实现京东商品分类侧边栏
Dec 11 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
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
php数据访问之增删改查操作
2016/05/09 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
Using the TextRange Object
2006/10/14 Javascript
javascript网页关键字高亮代码
2008/07/30 Javascript
jQuery autocomplete插件修改
2009/04/17 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
python中adb有什么功能
2020/06/07 Python
简单说下OSPF的操作过程
2014/08/13 面试题
兼职业务员岗位职责
2014/01/01 职场文书
初二生物教学反思
2014/02/03 职场文书
开服装店计划书
2014/08/15 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
礼仪培训心得体会
2016/01/22 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS