详解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实现标签上移、下移、置顶
Apr 26 Javascript
js代码实现随机颜色的小方块
Jul 30 Javascript
JavaScript实现向右伸出的多级网页菜单效果
Aug 25 Javascript
微信小程序 网络请求(post请求,get请求)
Jan 17 Javascript
jquery实现简单实用的轮播器
May 23 jQuery
Vue+Element使用富文本编辑器的示例代码
Aug 14 Javascript
label+input实现按钮开关切换效果的实例
Aug 16 Javascript
解决Vue编译时写在style中的路径问题
Sep 21 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
Feb 09 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
May 05 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
Nov 04 Javascript
微信小程序实现滚动加载更多的代码
Dec 06 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分页示例代码
2007/03/19 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
不安全的常用的js写法
2009/09/15 Javascript
js里的prototype使用示例
2010/11/19 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
python计算时间差的方法
2015/05/20 Python
详解Python字符串对象的实现
2015/12/24 Python
python中map的基本用法示例
2018/09/10 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
材料专业大学毕业生自荐书
2014/07/02 职场文书
捐助感谢信
2015/01/22 职场文书
布达拉宫导游词
2015/02/02 职场文书
给学校的建议书400字
2015/09/14 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android