最近在自學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里傳參。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。