详解React native fetch遇到的坑
最近在自学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的问题。
登录成功之后,我们可以打印出上面的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里传参。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。