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