開發(fā)過程中總是會遇到諸如題目中的問題,前后端各執(zhí)一詞,有時不惜為此爭得臉紅脖子粗。這里記錄一下,工作中我是怎么處理這些問題的,大家慎重參考,學(xué)藝不精被打臉,跟本人無關(guān)。
這篇文章主要講這么幾個方面:1.服務(wù)端到底有沒有返回某個字段?2.客戶端到底有沒有傳某個字段到服務(wù)端?3.服務(wù)端要求傳數(shù)組,可是Http請求里面的數(shù)組是個什么鬼?各位乘客請系好安全帶,馬上就要發(fā)車了!
1. 服務(wù)端到底有沒有返回某個字段?
核心思想就一句話:重新請求,重新返回。
我好想聽見有人說:"我褲子都脫了,你給我看這個?"。這位乘客別生氣,且容我慢慢道來。你可以在Android Monitor里面把返回的數(shù)據(jù)輸出一下,然后把CTRL+C/V轉(zhuǎn)發(fā)給服務(wù)端的同學(xué)。But!服務(wù)端的同學(xué)就開始跟你懟:"我返回的數(shù)據(jù)沒有問題呀";"你本地是不是加了緩存";"你調(diào)錯接口了吧"...Shut Up!即使你把他說服了,你還得配合他聯(lián)調(diào),繩命是剁么的回晃,繩命是入刺的井猜,哪能浪費在這些事情上。
我們的目標(biāo)是重新構(gòu)造一個請求,然后重放一下。為了構(gòu)造這個請求,我們在原來網(wǎng)絡(luò)請求框架上處理流程中添加一個方法,用以打印請求URL和請求參數(shù)。如果請求方式是GET,不妨直接把URL和參數(shù)拼接好,然后再打印。如果是post請求,相對麻煩一些,寫一個html文件,用打印出來的URL和請求參數(shù)構(gòu)建一個form表單,通過form表單,在瀏覽器中請求。
OK,現(xiàn)在你手里面有一個完整的URL或表單請求,如果后端同學(xué)不肯彎腰撿肥皂,你就可以把東西丟給他讓他自己反省。
下面貼一下我用的表單:
<html>
<head>
<meta charset='utf-8' />
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
<title>打臉神器</title>
<style type="text/css">
input{
margin: 8px auto 8px 8px;
}
</style>
</head>
<body>
<form action="http://www.baidu.com/s" method="post">
<span>word</span><input type="text" name="word"><br>
<input type="submit" value="提交">
</form>
</body>
2. 客戶端到底有沒有傳某個字段到服務(wù)端?
有的時候自己都不確定調(diào)用接口的時候有沒有把要求的字段傳過去,這個時候完全看服務(wù)端大爺?shù)哪樕珕??怎么可能?他們還沒那么拽(不過話又說回來,當(dāng)你沒有更好的辦法的時候還是態(tài)度好一點,跟人家好好配合)。方法也就一句話:"在服務(wù)端檢查一下客戶端的傳參"??煜掳嗔?,就不瞎扯別的了,趕緊寫完收工。
直接講我的做法,我在自己電腦上搭了一個PHP環(huán)境(PHP簡單好用,你值得擁有),然后把請求的URL重定向到本地的PHP頁面。比如我的電腦局域網(wǎng)ip是 192.168.1.66,PHP服務(wù)器運行在80端口,PHP頁面是index.php,客戶端別的都不用變,只用把請求URL改成http://192.168.1.66:80/demo/index.php 就可以在PHP服務(wù)器上接收到請求了。檢驗字段什么的,都不在話下。
這句神奇的PHP代碼就是echo $_REQUEST['參數(shù)名稱']。
3. 服務(wù)端要求傳數(shù)組,可是Http請求里面的數(shù)組是個什么鬼?
這個內(nèi)容其實可以算是2的一個引申。服務(wù)端說讓客戶端傳數(shù)組,前端同學(xué)一臉的懵比,What 數(shù)組???懵歸懵,我還是有一點思路的。像2一樣,我把請求重新定向到本地PHP頁面,然后不斷的改客戶端代碼,根據(jù)PHP的接收情況,不斷嘗試終于被我發(fā)現(xiàn)了真相!其實所謂的數(shù)組是一偽名詞,客戶端傳過去的數(shù)據(jù)是這個樣子的:
array[0]=value0&array[1]=value1
看完之后你可能也有點懵,直接上代碼看看我是怎么處理的:
Map<String,String> params = new HashMap<>();
String array[] = new String[]{"value0","value1"};
for(int i =0;i<array.length;i++){
params.put(String.format("array[%d]",i),array[i]);
}
這樣一來,服務(wù)端就能按照解析數(shù)組來解析客戶端的請求參數(shù)了。
上面介紹的方法并不局限于上面所提到的問題,開發(fā)過程中遇到的很多問題都可以用上面的方法來解決。
突然想到,如果使用fiddler抓包工具。。。難道我是拿著lowB技術(shù)在開車?不行,我得去研究一下!