相信大家都做過PHP請求API接口獲取數(shù)據(jù),比如淘寶API,微信公眾平臺,天氣查詢,快遞查詢等,有的需要參照接口文檔根據(jù)簽名算法構(gòu)造sign(簽名),或者設(shè)置token,然后通過curl發(fā)送POST請求帶上參數(shù),獲得返回?cái)?shù)據(jù),一般是json或者xml格式。
但是現(xiàn)在的情況反過來了,我們要開發(fā)PHP服務(wù)器端的API接口,也就是別人請求我們,我們驗(yàn)證請求合法性,并查詢數(shù)據(jù)返回。 這種情況其實(shí)在手機(jī)app開發(fā)中用到,手機(jī)APP應(yīng)用往往需要請求PHP接口獲取數(shù)據(jù),不過這個請求一般是不用經(jīng)過驗(yàn)證的,根據(jù)不同的功能請求不同的url,通常也是get方式傳參數(shù)直接獲取數(shù)據(jù)。 本文簡單講講服務(wù)器端驗(yàn)證請求合法性的方法,和接收參數(shù)的方式。 簡單的get請求如:http://www./api/get_cat?id=2,請求這個網(wǎng)址會返回一些數(shù)據(jù),無論是誰用什么編程語言請求都能得到數(shù)據(jù)。 那么在需要驗(yàn)證合法性的情況下這樣顯然是不行的。所以需要一個秘鑰,這個時(shí)候往往用POST方式請求url。 比如傳遞的參數(shù)中有個簽名sign,值是98888,當(dāng)然生成sign的方式很多而且不可能這么簡單,這里只是隨便寫,那么服務(wù)器端接收到sign是98888,假如我們約定98888就是合法的,這個時(shí)候判斷sign是否為98888就可以驗(yàn)證這是合法請求了。 但是這樣也太簡單了,一下子就被破解了,設(shè)置這個sign就毫無意義了。所以要有一個生成sign的規(guī)則,請求的時(shí)候根據(jù)這個規(guī)則生成sign傳參,服務(wù)器端接收的時(shí)候也根據(jù)這個規(guī)則生成sign,如果生成的sign一致,表明這是合法請求。每次請求都會帶上sign進(jìn)行驗(yàn)證。 還有一種驗(yàn)證叫token,第一次請求的時(shí)候驗(yàn)證token,在一定時(shí)間內(nèi)不用再次驗(yàn)證。這要分兩步,第一步先請求獲取token的接口得到token,第二步才是請求具體接口的功能,需要帶上token傳參。由于第一次請求token的時(shí)候,服務(wù)器端先把token存儲起來了再返回的,所以后面的請求判斷傳過來的token是否存在就可以驗(yàn)證了。 許多接口開發(fā)都同時(shí)使用兩者方式保證私密和安全。 還有一點(diǎn),發(fā)送POST請求往往使用PHP的CURL模塊,比如對方通過curl發(fā)送POST請求,curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string),這里$post_string是傳PHP數(shù)組的形式好,還是json格式呢? 如果是傳PHP數(shù)組,我這邊直接$_POST[‘xx’]獲取參數(shù),如果是傳的json格式,我這邊好像要用file_get_contents(‘php://input’, ‘r’)獲取傳過來的json數(shù)據(jù),然后解析json得到參數(shù)。 什么情況下用第二種? 這個曾經(jīng)在網(wǎng)上提問過,看看大家怎么回答:
我覺得你想你的代碼簡潔一點(diǎn)可以用第二種,我記得weixin的php sdk好像類似就是第二種(當(dāng)然那是xml格式) 還有如果對方使用面向?qū)ο笾苯有蛄谢鰜淼膉son的話,用json會讓他的代碼更簡潔一點(diǎn)。 第一種做法,是傳輸?shù)氖莊orm表單POST協(xié)議,PHP會把PHP數(shù)組變成HTTP表單的格式,跨語言通用,但是這種并不是主流的API協(xié)議,而更像是模擬提交表單。 絕大多數(shù)API協(xié)議會用JSON POST,第二種做法,即在HTTP Body里放JSON數(shù)據(jù)。也是跨語言的,但作為API更友好。 第一種方法,直接PHP curl,如果數(shù)據(jù)內(nèi)容沒處理好,數(shù)組value里傳了 @/xxx/xxx 這樣的內(nèi)容,curl會把服務(wù)器上的本地文件傳出去,注意防范。 x-www-form-urlencoded是RFC標(biāo)準(zhǔn),沒什么不兼容的,豈止跨語言,還跨越時(shí)空。JSON這種是近幾年想出來的,不是標(biāo)準(zhǔn),用著方便而已。 |
|