淺談 PHP 與手機 APP 開發(API 接口開發)

本文內容轉載自:http://www.thinkphp.cn/topic/5023.html

這個帖子寫給不太了解PHP與API開發的人

一、先簡單回答兩個問題:

1、PHP 可以開發客戶端?
答:不可以,因為PHP是腳本語言,是負責完成 B/S架構 或 C/S架構 的S部分,即:服務端的開發。(別去糾結 GTK、WinBinder)

2、為什么選擇 PHP 作為開發服務端的首選?
答:跨平臺(可以運行在UNIX、LINUX、WINDOWS、Mac OS下)、低消耗(PHP消耗相當少的系統資源)、運行效率高(相對而言)、MySQL的完美搭檔,本身是免費開源的,......

二、如何使用 PHP 開發 API(Application Programming Interface,應用程序編程接口) 呢?

做過 API 的人應該了解,其實開發 API 比開發 WEB 更簡潔,但可能邏輯更復雜,因為 API 其實就是數據輸出,不用呈現頁面,所以也就不存在 MVC(API 只有 M 和 C),
1、和 WEB 開發一樣,首先需要一些相關的參數,這些參數,都會由客戶端傳過來,也許是 GET 也許是 POST,這個需要開發團隊相互之間約定好,或者制定統一規范。
2、有了參數,根據應用需求,完成數據處理,例如:任務進度更新、APP內購、一局游戲結束數據提交等等
3、數據邏輯處理完之后,返回客戶端所需要用到的相關數據,例如:任務狀態、內購結果、玩家信息等等
數據怎么返給客戶端?
直接輸出的形式,如:JSON、xml、TEXT 等等。
4、客戶端獲取到你返回的數據后,在客戶端本地和用戶進行交互

臨時寫的一個簡單 API 例子:

  1. <?php
  2. $output?=?array();
  3. $a?=?@$_GET['a']???$_GET['a']?:?'';
  4. $uid?=?@$_GET['uid']???$_GET['uid']?:?0;
  5. if?(empty($a))?{
  6. ????$output?=?array('data'=>NULL,?'info'=>'坑爹啊!',?'code'=>-201);
  7. ????exit(json_encode($output));
  8. }
  9. //走接口
  10. if?($a?==?'get_users')?{
  11. ????//檢查用戶
  12. ????if?($uid?==?0)?{
  13. ????????$output?=?array('data'=>NULL,?'info'=>'The?uid?is?null!',?'code'=>-401);
  14. ????????exit(json_encode($output));
  15. ????}
  16. ????//假設?$mysql?是數據庫
  17. ????$mysql?=?array(
  18. ????????10001?=>?array(
  19. ????????????'uid'=>10001,
  20. ????????????'vip'=>5,
  21. ????????????'nickname'?=>?'Shine?X',
  22. ????????????'email'=>'979137@qq.com',
  23. ????????????'qq'=>979137,
  24. ????????????'gold'=>1500,
  25. ????????????'powerplay'=>?array('2xp'=>12,'gem'=>12,'bingo'=>5,'keys'=>5,'chest'=>8),
  26. ????????????'gems'=>?array('red'=>13,'green'=>3,'blue'=>8,'yellow'=>17),
  27. ????????????'ctime'=>1376523234,
  28. ????????????'lastLogin'=>1377123144,
  29. ????????????'level'=>19,
  30. ????????????'exp'=>16758,
  31. ????????),
  32. ????????10002?=>?array(
  33. ????????????'uid'=>10002,
  34. ????????????'vip'=>50,
  35. ????????????'nickname'?=>?'elva',
  36. ????????????'email'=>'elva@ezhi.net',
  37. ????????????'qq'=>NULL,
  38. ????????????'gold'=>14320,
  39. ????????????'powerplay'=>?array('2xp'=>1,'gem'=>120,'bingo'=>51,'keys'=>5,'chest'=>8),
  40. ????????????'gems'=>?array('red'=>13,'green'=>3,'blue'=>8,'yellow'=>17),
  41. ????????????'ctime'=>1376523234,
  42. ????????????'lastLogin'=>1377123144,
  43. ????????????'level'=>112,
  44. ????????????'exp'=>167588,
  45. ????????),
  46. ????????10003?=>?array(
  47. ????????????'uid'?=>?10003,
  48. ????????????'vip'?=>?5,
  49. ????????????'nickname'?=>?'Lily',
  50. ????????????'email'?=>?'Lily@ezhi.net',
  51. ????????????'qq'?=>?NULL,
  52. ????????????'gold'?=>?1541,
  53. ????????????'powerplay'=>?array('2xp'=>2,'gem'=>112,'bingo'=>4,'keys'=>7,'chest'=>8),
  54. ????????????'gems'?=>?array('red'=>13,'green'=>3,'blue'=>9,'yellow'=>7),
  55. ????????????'ctime'?=>?1376523234,
  56. ????????????'lastLogin'=>?1377123144,
  57. ????????????'level'?=>?10,
  58. ????????????'exp'?=>?1758,
  59. ????????),
  60. ????);
  61. ????
  62. ????$uidArr?=?array(10001,10002,10003);
  63. ????if?(in_array($uid,?$uidArr,?true))?{
  64. ????????$output?=?array('data'?=>?NULL,?'info'=>'The?user?does?not?exist!',?'code'?=>?-402);
  65. ????????exit(json_encode($output));
  66. ????}
  67. ????//查詢數據庫
  68. ????$userInfo?=?$mysql[$uid];
  69. ????
  70. ????//輸出數據
  71. ????$output?=?array(
  72. ????????'data'?=>?array(
  73. ????????????'userInfo'?=>?$userInfo,
  74. ????????????'isLogin'?=>?true,//是否首次登陸
  75. ????????????'unread'?=>?4,//未讀消息數量
  76. ????????????'untask'?=>?3,//未完成任務
  77. ????????),?
  78. ????????'info'?=>?'Here?is?the?message?which,?commonly?used?in?popup?window',?//消息提示,客戶端常會用此作為給彈窗信息。
  79. ????????'code'?=>?200,?//成功與失敗的代碼,一般都是正數或者負數
  80. ????);
  81. ????exit(json_encode($output));
  82. }?elseif?($a?==?'get_games_result')?{
  83. ????//...
  84. ????die('您正在調?get_games_result?接口!');
  85. }?elseif?($a?==?'upload_avatars')?{
  86. ????//....
  87. ????die('您正在調?upload_avatars?接口!');
  88. }
復制代碼
復制代碼

點擊測試(對于客戶端而言,也是直接調用這樣的地址):
http://www.ezhi.net/api/test/index.php
http://www.ezhi.net/api/test/index.php?a=get_users
http://www.ezhi.net/api/test/index.php?a=get_users&uid=10001
http://www.ezhi.net/api/test/index.php?a=get_users&uid=10002
http://www.ezhi.net/api/test/index.php?a=get_users&uid=10003

三、實際項目中,我們在開發 API 應該注意的幾個事項(僅供參考):
1、單文件實現多接口的形式有很多種,例如:if..elseif.. 或 switch 或 動態方法 (也就是TP的這種訪問函數體的形式)
2、對于數據的輸出最好用json,json具有相當強大的跨平臺性,市場上各大主流編程語言都支持json解析,json正在逐步取代xml,成為網絡數據的通用格式
3、接口安全,一定要增加接口驗證。例如,客戶端和服務端針對不同接口統一做好加密方式,服務端在對于每次接口需要都要進行驗證。以保證防止接口被惡意刷新或黑客惡意調用,尤其是大型商業應用。
4、對于線上的 API 必須保證所有接口正常且關閉所有的錯誤信息 => error_reporting(0),在輸出JSON 時,不能有任何其它輸出,否則,客戶端將解析數據失敗,直接 Crash!
5、開發 API 和 WEB 有一定的區別,如果是 WEB 的話,可能代碼出錯了,不會導致特別嚴重的錯誤,也許只是導致數據寫入和查詢失敗,也許導致 WEB 的某個部分錯位或亂碼。但如果是 API,直接 Crash!
6、做接口開發,不建議使用框架開發,原因概括起來有兩點(其實我有點冒風險的,本人也是 TPer 一枚,畢竟這是TP的官網):
  1)客戶端一般對服務端的響應速度有極高要求,因此,使用最原生態的 PHP 完成接口開發,是最高效的,假如用到了框架,還需要加載各種不需要多余的文件,就好比夏天穿了件冬天的衣服。試想,你在玩手機的時候,使用一個應用隨便一個操作,等半天才有動靜,你受的了嗎?

  2)就是上面第4點提到的,框架對于WEB開發,是件很幸福的事,但對于 API 而言,你實在不敢想象它會給你出什么岔子!最后你將痛苦不堪~~因為很多框架都是為 WEB 誕生的(我也很期待有一天能看到專門為開發 API 而生的框架或者擴展)

  這個也有人糾結,接口效率與穩定性,還得看編碼的人,有的人可能寫的還不如框架跑的快,也有人覺得用框架沒什么問題,這里只是建議,關鍵看自己的實際情況,同時建議代碼上線前壓測一下

  說到這,不得不說扯一下,騰訊微博淘寶等開放平臺。其實那些開放平臺,所謂的開放,就是給你提供一個這樣的接口,你根據他們提供的技術文檔,按他們制定的格式和要求,調它們提供的接口文件(一般都是返回JSON或者xml),你就可以獲取到他們的相關信息,例如:QQ用戶基本信息、淘寶店鋪、商品消息等等。然后在根據這些消息,在你的應用里完成交互。

  其實,ajax 也是調用 API 的一種體現形式,你覺得呢? 呵呵~~

轉載于:https://www.cnblogs.com/gavinyyb/p/6181744.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371823.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

獲取人口_「微科普」14億人口數據是如何得到的?

中國經濟交出了2019年終答卷GDP總量近百萬億元人均GDP突破1萬美元……小伙伴們在關心經濟發展的同時也非常關注人口數據14億人口的話題嗖的一下就上了熱搜大家想不想知道14億人口的數據是怎么得到的&#xff1f;我們今天就來科普一下如何獲取人口總量&#xff1f;通常情況下&am…

8.動態規劃(1)——字符串的編輯距離

動態規劃的算法題往往都是各大公司筆試題的常客。在不少算法類的微信公眾號中&#xff0c;關于“動態規劃”的文章屢見不鮮&#xff0c;都在試圖用最淺顯易懂的文字來描述講解動態規劃&#xff0c;甚至有的用漫畫來解釋&#xff0c;認真讀每一篇公眾號推送的文章實際上都能讀得…

更改Java包名稱如何改變我的系統架構

即使只是少量更改角度&#xff0c;也可能對您如何使用系統產生深遠影響。 假設您正在用Java編寫Web應用程序。 在系統中&#xff0c;您處理訂單&#xff0c;客戶和產品。 作為Web應用程序&#xff0c;您的類包括諸如Controller&#xff0c;PersonRepository&#xff0c;Custome…

靜態屬性_Java面試題—內部類和靜態內部類的區別

內部類和靜態內部類的區別內部類&#xff1a;1、內部類中的變量和方法不能聲明為靜態的。2、內部類實例化&#xff1a;B是A的內部類&#xff0c;實例化B&#xff1a;A.B b new A().new B()。3、內部類可以引用外部類的靜態或者非靜態屬性及方法。靜態內部類&#xff1a;1、靜態…

儲存與更新 access_token

做微信的項目&#xff0c;一開始就是 access_token 的申請&#xff0c;微信文檔上寫的比較清楚&#xff1a; 1、為了保密appsecrect&#xff0c;第三方需要一個access_token獲取和刷新的中控服務器。而其他業務邏輯服務器所使用的access_token均來自于該中控服務器&#xff0c;…

Eclipse安裝以及JDK環境變量配置

首先是下載Eclipse&#xff1b;點擊鏈接打開Eclipse官網eclipse官網點擊DownLoad Packages&#xff0c;注意是點擊“DownLoad Packages”點擊你需要的版本開始下載&#xff08;一般是64bit Eclipse IDE&#xff09;等待幾秒鐘&#xff0c;開始下載這樣Eclipse已經下載好了&…

完整的Web應用程序Tomcat JSF Primefaces JPA Hibernate –第1部分

我們創建了這篇文章&#xff0c;將展示如何使用以下工具創建完整的Web應用程序&#xff1a;Tomcat7&#xff0c;帶有Primefaces的JSF2&#xff08;Facelets和Libraries&#xff09;&#xff08;具有AutoComplete&#xff09;&#xff0c;JPA / Hibernate&#xff08;具有NxN關系…

mysql主從架構升級_實戰項目——mysql主從架構的實現

一主一從1.1 環境準備&#xff1a;centos系統服務器2臺、 一臺用戶做Mysql主服務器&#xff0c; 一臺用于做Mysql從服務器&#xff0c; 配置好yum源、 防火墻關閉、 各節點時鐘服務同步、 各節點之間可以通過主機名互相通信1.2 準備步驟&#xff1a;1)iptables -F && s…

FastReport.Net使用:[30]對話框使用

使用對話框需要知道的地方 1.按鈕的DialogResult屬性。 假如DialogResult屬性值為OK的按鈕被點擊&#xff0c;報表將會展現后面的對話框或者報表頁&#xff1b;如果屬性值為None&#xff0c;則停留在當前窗體&#xff1b;如果為其他值&#xff0c;則直接退出報表打印&#xff0…

模擬聊天室顯示語句保持最新顯示

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>模擬聊天室顯示語句保持最新顯示</title> <style> *{ border-collapse: collapse; } .dialog_box{ width:400px; height: 600px; margin…

改善Java EE生產支持技能的8種方法

參與Java EE生產支持的每個人都知道這項工作可能很困難。 7/24傳呼機支持&#xff0c;定期處理的多個事件和錯誤修復&#xff0c;來自客戶和管理團隊的壓力&#xff0c;要求它們盡快解決生產問題并防止再次發生。 在日常工作中&#xff0c;您還必須照顧由多個IT交付團隊驅動的多…

plsql連接mysql_安裝了mysql和pl/sql,怎么配置讓pl/sql能聯接mysql數據庫

64位環境下&#xff0c;使用PL/SQL Developer連接Oracle&#xff1a;?1. 下載32位Oracle InstantClient&#xff0c;并展開到某目錄&#xff0c;例如C:\instantclient-basic-nt-11.2.0.2.0&#xff1b;?2. 將系統的tnsnames.ora拷貝到該目錄下&#xff1b;?3. 在PLSQL Devel…

varnish基礎

varnish概念 初步認識 首先來跟我學習&#xff0c;v~a~r~n~i~s~h~~ &#xff0c;學會了沒有~ 當然還有很重要的一個概念&#xff0c;它是高性能緩存服務器&#xff0c;舉個例子。 好比我們要去買東西&#xff0c;所有的我們需要的東西是在超市廠家生產出來的&#xff0c;我們需…

引入Spring集成

在本文中&#xff0c;我們介紹Spring Integration 。 如果您以前沒有使用過Spring Integration&#xff0c;那么可能會幫助您復習Gregor Hohpe的Enterprise Integration Patterns 。 我還將推薦Josh Long 撰寫的這篇出色的介紹性文章 。 上下文設置 簡而言之&#xff0c; 企業…

PAT 1024. 科學計數法 (20)

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法&#xff0c;其滿足正則表達式[-][1-9]"."[0-9]E[-][0-9]&#xff0c;即數字的整數部分只有1位&#xff0c;小數部分至少有1位&#xff0c;該數字及其指數部分的正負號即使對正數也必定明確給出。 現以科…

Mac上Hive環境搭建

本文介紹在Mac上搭建Hive環境。 建議首先配置好Hadoop&#xff0c;搭建與配置可以參考我之前的博文Mac Hadoop的安裝與配置。 當然你也可以選擇使用Docker搭建環境&#xff0c;本文不作介紹。 安裝 對于MacOs&#xff0c;推薦使用HomeBrew安裝hive&#xff0c;一步到位。 $ bre…

mysql+創建備份賬戶_mysql 添加用戶,授予權限,數據庫備份等 (轉載)

一&#xff0c;連接MySQL格式&#xff1a;mysql -h 遠程主機地址 -u 用戶名 -p 回車輸入密碼進入&#xff1a;mysql -u root -p 回車Enter password: ,輸入密碼就可以進入mysql> 進入了退出命令:>exit 或者ctrlD二&#xff0c;MySQL管理與授權1.修改密碼&#xff1a;格式…

分代緩存和轉換

康拉德&#xff08;Konrad&#xff09;最近在我們公司的技術室中分享了有關如何完成緩存的有趣文章&#xff0c;這是一個大型的波蘭社交網絡nk.pl。 算法中的核心概念之一是分代緩存 &#xff08;請參閱此處或此處 &#xff09;。 基本思想是&#xff0c;對于緩存鍵&#xff0c…

css精靈

○ css 精靈&#xff08;Sprites&#xff09;技術利用photoshop將圖片整合&#xff0c;然后用background-images&#xff0c;background-position&#xff0c;background-repeat技術&#xff0c;對圖片進行精確定位。 ○ 優點&#xff1a;減少http請求數量&#xff0c;減少服務…

基于Jenkins+Gitlab的自動化部署實戰

故事背景 一個中小型企業&#xff0c;是典型的互聯網公司&#xff0c;當初期的時候可能運維只能標配到2~3人&#xff0c;此時隨著公司的發展&#xff0c;項目會逐漸增多。前期部署項目可能都是手動的&#xff0c; 俗稱“人肉部署”&#xff0c;這簡直是無比的痛苦&#xff0c;不…