1滑绒、在請(qǐng)求數(shù)據(jù)的時(shí)候闷堡,一般情況下我們會(huì)直接提交Content-type
是json
數(shù)據(jù)格式的請(qǐng)求。類似
fetch('https://mywebsite.com/endpoint/', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
firstParam: 'yourValue',
secondParam: 'yourOtherValue',
})
})
當(dāng)我開始請(qǐng)求登錄接口的時(shí)候疑故,發(fā)現(xiàn)上面的請(qǐng)求方法失效了杠览,想了好多辦法都不知道問題出在哪里,最后試了下抓包焰扳,才發(fā)現(xiàn)原來請(qǐng)求登錄接口的時(shí)候倦零,content-type
是application/x-www-form-urlencode
,于是我搜了下這方面的知識(shí)吨悍。我們?cè)谔峤槐韱蔚臅r(shí)候,form
表單參數(shù)中會(huì)有一個(gè)enctype
的參數(shù)蹋嵌。enctype
指定了HTTP
請(qǐng)求的Content-Type
育瓜。默認(rèn)情況下,HTML
的form
表單的enctype=application/x-www-form-urlencoded
栽烂。application/x-www-form-urlencoded
是指表單的提交躏仇,并且將提交的數(shù)據(jù)進(jìn)行urlencode
。默認(rèn)情況下腺办,我們所有的表單提交都是通過這種默認(rèn)的方式實(shí)現(xiàn)的焰手。文檔中是有記載的:
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
,但是可以達(dá)到目的
//獲取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聊闯、登錄成功之后工猜,后臺(tái)需要根據(jù)sessionid
來判斷登錄狀態(tài)。當(dāng)請(qǐng)求的接口是必須登錄之后才能獲得數(shù)據(jù)的時(shí)候菱蔬,就不能用傳統(tǒng)的寫法來請(qǐng)求了篷帅。javascript
使用fetch
進(jìn)行跨域請(qǐng)求時(shí)默認(rèn)是不帶cookie
的,所以會(huì)造成session
失效拴泌。那所以在登錄請(qǐng)求的時(shí)候需要加上credentials: ‘include’
這個(gè)字段魏身。
fetch(Api.checkLoginSecurity , {
credentials: 'include',
method: 'POST',
headers:{
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'username='+ this.props.userName + '&password=' + this.userPassword
})
在需要登錄后才能獲取數(shù)據(jù)的接口也需要加上
fetch(url , {
credentials: 'include',
method: 'GET',
})
此處還要強(qiáng)調(diào)一下get
請(qǐng)求和post
請(qǐng)求,經(jīng)別人提醒弛针,發(fā)現(xiàn)雖然他寫了個(gè)body= {*}
叠骑,讓我誤以為是用POST
方式,其實(shí)body
只是參數(shù)的字段削茁,實(shí)際上用的還是GET
請(qǐng)求宙枷,所以把POST
改為GET
(默認(rèn)是GET
掉房,所以就不需要寫method
),因?yàn)?code>GET無法在body
里傳參,也不需要header
慰丛,直接把參數(shù)寫在URL
里卓囚,只有POST
才是在body
里傳參。