《React-Native系列》31、 Fetch發送POST請求的坑與解決方案
來源:程序員人生 發布時間:2016-10-06 09:00:57 閱讀次數:5500次
我們在要求http接口時候,通常都會使用get和post的方式,針對表單提交這類的要求,我們通常采取post方式。
那末在RN中的Fetch API中post提交有哪些坑呢?讓我們擼起來。
我們先來講說Server真個代碼,通常我們從Request獲得參數時的方法為:
String paraValue = request.getParameter(paraName);
我們下面說的判斷能不能獲得參數,就是依照這類方法來獲得。
在 RN中,通常我們會怎樣寫代碼呢?
方案1(不推薦):
let url = "http://127.0.0.1:8080/api/testFetch”
let params = "name=admin&password=admin123”;
fetch(url , {
method: 'POST',
headers: {},
body: params,
}).then((response) => {
if (response.ok) {
return response.json();
}
}).then((json) => {
alert(JSON.stringify(json));
}).catch((error) => {
console.error(error);
});
此時我們發現在Server端沒法獲得到name和password的值。
換成GET試試,將params追加到url后,發現ok。那這是甚么情況呢?下面講授。
好,不行,我們就再換1種方法試試唄。
方案2(不推薦): let params = {"name":"admin","password":"admin123"};
fetch(url , {
method: 'POST',
headers: {},
body:JSON.stringify(params),
}).then((response) => {
if (response.ok) {
return response.json();
}
}).then((json) => {
alert(JSON.stringify(json));
}).catch((error) => {
console.error(error);
});
我們直接將params封裝成1個JSON對象,然后在body里將JSON對象轉成字符串傳過去,發現然并卵,Server端還是獲得不到值。
好,我們不兜圈子了,直接說明緣由。
其實,方案1和方案2都是直接在body里傳遞了1個字符串,在Server端獲得body的方式以下:
StringBuilder buffer = new StringBuilder();
BufferedReader reader = beat.getRequest().getReader();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
String body = buffer.toString();
通過這類方法我們可以獲得到傳入的字符串。
既然能獲得到字符串,那末我們也能夠拿到我們傳入的值了,可以轉JSON、或按&切割字符串,只不過這類解決方案好像有點挫啊!!!
或許你會問在
jquery中,我們就是依照方案1這類方式做的啊,怎樣好使呢?
答:由于參數 "name=admin&password=admin123” 在
jquery中,傳入對象框架會自動封裝成formData的情勢,fetch沒有這個功能。
終極方案(推薦使用):
既然fetch不會自動轉FormData,那我們自己new1個FormData,直接傳給body。
在FormData中也能夠傳遞字節流實現上傳圖片的功能。參考:http://blog.csdn.net/codetomylaw/article/details/52446786
let formData = new FormData();
formData.append("name","admin");
formData.append("password","admin123");
fetch(url , {
method: 'POST',
headers: {},
body: formData,
}).then((response) => {
if (response.ok) {
return response.json();
}
}).then((json) => {
alert(JSON.stringify(json));
}).catch((error) => {
console.error(error);
});
這樣我們就能夠在Server端獲得到name和password的值了。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈