api 接口開發理論 在php中調用接口以及編寫接口

如:
http://localhost/openUser.php?act=get_user_list&type=json

在這里openUser.php相當于一個接口,其中get_user_list 是一個API(獲取用戶列表),講求返回的數據類型為JSON格式。

你只需要在你PHP代碼中執行這條鏈接他就會返回。
GET方式的直接使用
$file_contents = file_get_content('http://localhost/openUser.php?act=get_user_list&type=json')

POST方式得用下面的(需要開啟PHP curl支持)。
$url = 'http://localhost/openUser.php?act=get_user_list&type=json';
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
curl_setopt ( $ch, CURLOPT_POST, 1 ); //啟用POST提交
$file_contents = curl_exec ( $ch );

curl_close ( $ch );



?在PHP 中編寫接口


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

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/hnbiao/p/6545104.html

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

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

相關文章

怎么樣的框架對于開發者是友好的?

云原生離.NET開發到底有多遠&#xff1f;云原生的概念由來不久&#xff0c;故事從“上云”開始&#xff0c;伴隨dorker、k8s等技術的推出&#xff0c;以及CNCF與各大云廠商的共同加持&#xff0c;云原生逐漸被大家所熟知。云原生不依賴具體的云&#xff0c;不管公有云還是私有云…

JS 燒腦面試題大賞

本文精選了20多道具有一定迷惑性的js題&#xff0c;主要考察的是類型判斷、作用域、this指向、原型、事件循環等知識點&#xff0c;每道題都配有詳細傻瓜式的解析&#xff0c;偏向于初學者&#xff0c;大佬請隨意。 第1題 let a 1 function b(a) {a 2console.log(a) } b(a)…

蘋果ios用js的Date()出現NaN問題解決辦法

原文:蘋果ios用js的Date&#xff08;&#xff09;出現NaN問題解決辦法ios使用如下方法獲得NaN&#xff0c;安卓手機則是正常計算&#xff0c;解決方法是換個這個時間的格式 new Date("2017-04-28 23:59:59").getTime() 換成如下方式就正常了&#xff0c;就是‘-’換成…

Thinkphp 驗證碼、文件上傳

一、驗證碼 驗證碼參數 例題&#xff1a;登錄時驗證下驗證碼 LoginController.class.php <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller {public function Login(){if(empty($_POST)){$this->display(); } e…

ArcGIS實驗教程——實驗四十七:數據驅動頁工具批量制作甘肅省各地級市人口七普專題圖集

本實驗詳細講解利用ArcGIS數據驅動頁工具,制作甘肅省各地級市人口七普專題圖集。 文章目錄 1. 數據驅動頁工具簡介2. 甘肅省各地級市人口七普專題圖集2.1 符號化及標注2.2 數據驅動頁的創建2.3 數據驅動頁面文本操作2.4 數據驅動頁的導出1. 數據驅動頁工具簡介 數據驅動頁面是…

為什么Java有GC調優而沒聽說過有CLR的GC調優?

前言在很多的場合我都遇到過一些群友提這樣的一些問題&#xff1a;為什么Java有GC調優而CLR沒有聽說過有GC調優呢&#xff1f;到底是Java的JVM GC比較強還是C#使用的.NET CLR的GC比較強呢&#xff1f;其實業內已經有幾位大佬的高贊文章和大家分享一下&#xff0c;主要討論JVM和…

Ubuntu16.04 - 安裝RabbitVCS,linux下的TortoiseSVN!!!

RabbitVCS 官網&#xff1a;http://rabbitvcs.org/ 1&#xff0c;添加PPA源。在shell里面執行下面命令&#xff1a; sudo add-apt-repository ppa:rabbitvcs/ppa 這個命令執行完畢后&#xff0c;查看執行結果看是否密鑰導入成功&#xff0c;成功截圖&#xff1a; 如果導入密鑰失…

8 種最坑的SQL錯誤用法

1、LIMIT 語句 2、隱式轉換 3、關聯更新、刪除 4、混合排序 5、EXISTS語句 6、條件下推 7、提前縮小范圍 8、中間結果集下推 總結 sql語句的執行順序&#xff1a; FROM <left_table>ON <join_condition><join_type>JOIN <right_table>WHERE &…

Vue根據菜單json數據動態按需加載路由Vue-router

每個菜單項對應一個頁面組件&#xff0c;根據菜單項動態按需加載路由 路由配置的正確寫法&#xff1a; /*router/index.js*/ import Vue from vue import Router from vue-router import url from ./url import store from ../storeVue.use(Router)const router new Router({/…

【ArcGIS微課1000例】0047:制圖表達(2)---河流漸變效果的實現

當我們在ArcMap中加載河流數據時,得到的效果往往如圖所示,僅僅是表示河流位置的線要素,既無法真實地反映河流的實際情況,同時在出圖的時候也遠沒有任何美化效果。 文章目錄 1.創建制圖表達2.添加幾何效果3.使用制圖規則4.使用制圖表達屬性覆蓋警告:這些操作會對您的數據庫…

操作系統思考 第二章 進程

第二章 進程 作者&#xff1a;Allen B. Downey 原文&#xff1a;Chapter 2 Processes 譯者&#xff1a;飛龍 協議&#xff1a;CC BY-NC-SA 4.0 2.1 抽象和虛擬化 在我們談論進程之前&#xff0c;我打算先定義幾個東西&#xff1a; 抽象&#xff08;Abstraction&#xff09;&…

1 句代碼,搞定 ASP.NET Core 綁定多個源到同一個類

問題有群友希望將路由中的信息綁定到一個Dto對象中&#xff1a;public class DDDDDto {[FromRoute(Name "collectionId")]public Guid collectionId { get; set; }[BindProperty(Name "relativeUrl")]public string relativeUrl { get; set; } }這樣就不用…

redux中間件的用法

1.定義 中間件就是一個函數&#xff0c;對store.dispatch方法進行了改造&#xff0c;在發出 Action 和執行 Reducer 這兩步之間&#xff0c;添加了其他功能。 2.舉例 日志中間件 import { applyMiddleware, createStore } from redux; import createLogger from redux-logger; …

設置git自動補全功能(windows版本)

目錄 下載 Git 的源代碼 在目錄中 git/contrib/completion/ 中找到 git-completion.bash 文件 將 git-completion.bash 文件改名為 .git-completion.bash 找到本機git安裝目錄 將.git-completion.bash文件復制到git安裝目錄下的etc文件夾 打開同目錄下的 bash.bashrc 文件&…

用Vue搭建一個應用盒子(二):datetime-picker

接著上次的進度&#xff0c;我們已經實現了一個todo-list。它已經具備了基本的功能&#xff0c;可以新建、編輯、刪除任務。但是美中不足的是&#xff0c;它的時間設定上只能通過輸入一段字符串來設定&#xff0c;很不社會。我們應該完成的效果是一個time-picker&#xff0c;日…

ArcGIS實驗教程——實驗四十八:ArcGIS制圖表達入門及案例教程

文章目錄 1. 制圖表達的概念1.1 什么是地圖表達1.2 使用制圖表達改善要素外觀1.3 制圖表達的優點2. 使用制圖表達2.1 創建制圖表達2.2 使用制圖表達來符號化圖層2.3 使用制圖表達規則3. 地圖表達實戰案例1.創建制圖表達2.添加幾何效果3.使用制圖規則4.使用制圖表達屬性覆蓋1. 制…

PAT (Advanced Level) 1070. Mooncake (25)

簡單貪心。先買性價比高的。 #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std;doub…

[轉]Java 18 還未用上,Java 19 最新兩大特性曝光

鐵打的 Java&#xff0c;流水的版本。 不久前&#xff0c;Java 18 才正式發布&#xff0c;遵循 Oracle 六個月發一版本的頻率&#xff0c;Java 19 將在今年 9 月出爐。這不&#xff0c;還沒等眾多開發者用上 Java 18&#xff0c;關于 Java 19 最新的兩個目標功能就被披露了出…

文本生成器(bzoj 1030)

Description JSOI交給隊員ZYX一個任務&#xff0c;編制一個稱之為“文本生成器”的電腦軟件&#xff1a;該軟件的使用者是一些低幼人群&#xff0c;他們現在使用的是GW文本生成器v6版。該軟件可以隨機生成一些文章―――總是生成一篇長度固定且完全隨機的文章—— 也就是說&…

C# 值類型和引用類型講解

要了解值類型和引用類型&#xff0c;我們首先要知道堆和棧的區別&#xff1a;① 棧是編譯期間就分配好的內存空間&#xff0c;因此你的代碼中必須就棧的大小有明確的定義&#xff1b;堆是程序運行期間動態分配的內存空間&#xff0c;你可以根據程序的運行情況確定要分配的堆內存…