基於API而設計,你是如何調用接口與編寫接口的呢

2022-02-06 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 );

一、先簡單回答兩個問題,更多認識可以拉到底部獲取視頻教程
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 例子:

<?php
$output = array();
$a = @$_GET['a'] ? $_GET['a'] : '';
$uid = @$_GET['uid'] ? $_GET['uid'] : 0;

if (empty($a)) {
    $output = array('data'=>NULL, 'info'=>'坑爹啊!', 'code'=>-201);
    exit(json_encode($output));
}

//走接口
if ($a == 'get_users') {
    //檢查用戶
    if ($uid == 0) {
        $output = array('data'=>NULL, 'info'=>'The uid is null!', 'code'=>-401);
        exit(json_encode($output));
    }

    //假設 $mysql 是資料庫
    $mysql = array(
        10001 => array(
            'uid'=>10001,
            'vip'=>5,
            'nickname' => 'Shine X',
            'email'=>'979137@qq.com',
            'qq'=>979137,
            'gold'=>1500,
            'powerplay'=> array('2xp'=>12,'gem'=>12,'bingo'=>5,'keys'=>5,'chest'=>8),
            'gems'=> array('red'=>13,'green'=>3,'blue'=>8,'yellow'=>17),
            'ctime'=>1376523234,
            'lastLogin'=>1377123144,
            'level'=>19,
            'exp'=>16758,
        ),
        10002 => array(
            'uid'=>10002,
            'vip'=>50,
            'nickname' => 'elva',
            'email'=>'elva@ezhi.net',
            'qq'=>NULL,
            'gold'=>14320,
            'powerplay'=> array('2xp'=>1,'gem'=>120,'bingo'=>51,'keys'=>5,'chest'=>8),
            'gems'=> array('red'=>13,'green'=>3,'blue'=>8,'yellow'=>17),
            'ctime'=>1376523234,
            'lastLogin'=>1377123144,
            'level'=>112,
            'exp'=>167588,
        ),
        10003 => array(
            'uid' => 10003,
            'vip' => 5,
            'nickname' => 'Lily',
            'email' => 'Lily@ezhi.net',
            'qq' => NULL,
            'gold' => 1541,
            'powerplay'=> array('2xp'=>2,'gem'=>112,'bingo'=>4,'keys'=>7,'chest'=>8),
            'gems' => array('red'=>13,'green'=>3,'blue'=>9,'yellow'=>7),
            'ctime' => 1376523234,
            'lastLogin'=> 1377123144,
            'level' => 10,
            'exp' => 1758,
        ),
    );

    $uidArr = array(10001,10002,10003);
    if (in_array($uid, $uidArr, true)) {
        $output = array('data' => NULL, 'info'=>'The user does not exist!', 'code' => -402);
        exit(json_encode($output));
    }

    //查詢資料庫
    $userInfo = $mysql[$uid];

    //輸出數據
    $output = array(
        'data' => array(
            'userInfo' => $userInfo,
            'isLogin' => true,//是否首次登陸
            'unread' => 4,//未讀消息數量
            'untask' => 3,//未完成任務
        ), 
        'info' => 'Here is the message which, commonly used in popup window', //消息提示,客戶端常會用此作為給彈窗信息。
        'code' => 200, //成功與失敗的代碼,一般都是正數或者負數
    );
    exit(json_encode($output));
} elseif ($a == 'get_games_result') {
    //...
    die('您正在調 get_games_result 接口!');
} elseif ($a == 'upload_avatars') {
    //....
    die('您正在調 upload_avatars 接口!');
}

點擊測試(對於客戶端而言,也是直接調用這樣的地址):
http://www.mano100.cn/api/test/index.php
http://www.mano100.cn/test/index.php?a=get_users
http://www.mano100.cn/test/index.php?a=get_users&uid=10001
http://www.mano100.cn/api/test/index.php?a=get_users&uid=10002
http://www.mano100.cn/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!

四、Thinkphp5開發restful-api接口

restful想必大家都聽過的了,至於是怎樣的,不懂的可以查看這篇文章:RESTful Api的設計與風格。

這裡分享一個視頻專輯【Thinkphp5開發restful-api接口】,目錄如下,連結回覆帖子後獲取。

章節1:開篇
課時1課程簡介04:48

章節2:基礎知識
課時2常用工具介紹_123:27
課時3常用工具介紹_212:49
課時4以豆瓣網為例, 講解restful api設計規範06:18
課時5thinkphp5簡易教程28:34
課時6為api項目搭建資料庫12:19
課時7使用markdown書寫接口文檔11:51
課時8為項目配置url08:57
課時9接口安全07:46
課時10接口開發前的準備工作(參數過濾)22:56

章節3:用戶接口
課時11驗證碼接口_116:28
課時12驗證碼接口_208:56
課時13驗證碼接口_306:21
課時14驗證碼接口_415:03
課時15用戶註冊接口10:01
課時16用戶登錄接口04:40
課時17用戶上傳頭像接口09:57
課時18用戶修改密碼接口06:37
課時19用戶找回密碼接口05:20
課時20用戶綁定郵箱或手機號09:41
課時21用戶修改暱稱06:21

章節4:文章接口
課時22新增文章04:56
課時23查看文章列表07:36
課時24查看單個文章04:38
課時25修改保存文章03:06
課時26刪除文章03:24

章節5:總結
課時27課程總結09:06

獲取地址:

連結:http://www.mano100.cn/thread-357-1-1.html

相關焦點

  • PHP如何更優雅地調用API接口
    通過ThinkAPI提供的SDK功能可以以更優雅的方式來調用API接口,首先需要在你的項目裡面安裝think-api庫(適用於任何PHP5.6+項目,沒有任何框架要求)。composer require topthink/think-api如果由於網絡問題無法安裝,可以使用阿里雲 Composer 全量鏡像。
  • 系統設計:API 接口的最佳實踐
    應用程式接口(API)是一種接口,它讓應用程式可以輕鬆地使用另一個應用程式的數據和資源,API 對於一個產品或公司的成功至關重要。如果沒有 API,你大部分喜歡的軟體今天就不會存在。https://api.domain.com/authors https://api.domain.com/authors/{id}/books這有助於新的開發人員快速了解你的 API 是什麼,以及如何遍歷你的數據模型。
  • Openapi 接口設計思路
    淘寶、阿里、騰訊都是這麼幹的,人家是大公司,規則的制定者,人家怎麼規定接口,你就得怎麼對接!!有一個網站叫 聚合數據 專門提供一些免費的和收費的優秀 API,有興趣的可以上去註冊玩玩。關於如何開發這樣的一套接口,刨除實際的業務邏輯不說,我們來看看怎麼設計?可能不全面僅供參考!先來看看有那幾點需要考量?我也是憑經驗和 Google。
  • 如何設計一個牛逼的API接口
    在日常開發中,總會接觸到各種接口。前後端數據傳輸接口,第三方業務平臺接口。一個平臺的前後端數據傳輸接口一般都會在內網環境下通信,而且會使用安全框架,所以安全性可以得到很好的保護。這篇文章重點討論一下提供給第三方平臺的業務接口應當如何設計?我們應該考慮哪些問題?
  • API接口設計
    按照RESTful的規範,不同的版本也應該用相同的API URL,通過header信息來判斷版本,再調用不同版本的程序進行處理。但是這明顯會給開發帶來巨大的成本。解決辦法有以下幾種:1.新版本兼容舊版本,所有舊版本的動作、欄位、操作,都在新版本中可以被實現,但明顯這樣的維護成本很大;2.不同的版本,用不同的URL來提供服務,在URL中通過v1、v2來區分版本號,比如v2.api.xxx.com/user的方式,或者http://api.domain.com/v2。
  • 如何編寫有效的接口測試?
    有效且覆蓋完整的接口測試,不僅能保障新功能的開發質量,還能讓開發在修改功能邏輯的時候有回歸的能力,同時也是能優雅地進行重構的前提。編寫接口測試要遵守哪些原則?測試代碼的結構應該是什麼樣的?接口測試有哪些實踐技巧?本文分享作者在接口測試上的實踐總結。
  • API 接口規範
    整型版本號:大功能版本發布形式;具有當前版本狀態下的所有API接口 。例如:v1、v2浮點型版本號:為小版本號,只具備補充api的功能,其他api都默認調用對應大版本號的api。舉例來說,有一個API提供動物園(zoo)的信息,還包括各種動物和僱員的信息,則它的路徑應該設計成下面這樣。
  • 基於postman進行接口測試實戰
    一:接口測試前準備接口測試是基於協議的功能黑盒測試,
  • Java springMVC] Restful風格API接口設計
    Restful風格API接口開發springMVC篇 Restful風格的API是一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件
  • 計算機畢業設計中微信小程序調用支付接口支付
    在微信提供的接口文檔中提供了一個微信支付接口,應該是直接調用這個接口就可以發起微信支付但是,當開始信心滿滿的去看所需參數時,懵逼了,這些參數是什麼在這些參數中最難理解和獲取的就是這兩個了,仔細研究後發現,package這個參數的獲取要調用微信提供的另一個接口,統一下單接口。原來在微信中支付需要先進行一下預下單。
  • 【PySpark源碼解析】教你用Python調用高效Scala接口
    當通過 spark-submit 提交一個 PySpark 的 Python 腳本時,Driver 端會直接運行這個 Python 腳本,並從 Python 中啟動 JVM;而在 Python 中調用的 RDD 或者 DataFrame 的操作,會通過 Py4j 調用到 Java 的接口。
  • API接口管理
    接口設計一般我們需要的接口信息有:url-地址method-請求方法params-參數type-參數類型const schemas={ projectId: { type: String, required: true }, url: { type: String, required: true
  • 如何保證API接口數據安全?
    ,定義好接口,各自開發自己的功能,最後進行聯調整合。無論是開發原生的APP還是webapp還是PC端的軟體,只要是前後端分離的模式,就避免不了調用後端提供的接口來進行業務交互。網頁或者app,只要抓下包就可以清楚的知道這個請求獲取到的數據,也可以偽造請求去獲取或攻擊伺服器;也對爬蟲工程師來說是一種福音,要抓你的數據簡直輕而易舉。那我們怎麼去解決這些問題呢?
  • API設計 - 從客戶端的角度設計後端的接口
    在一款APP產品的各個版本迭代中,兵馬的啟動指的是真正開始敲代碼的時候,糧草先行則是指前期的需求,交互,UI等評審準備階段,還有本文要說的接口的設計與評審。雖然很多時候一個api接口的業務,數據邏輯是後端提供的,但真正使用這個接口的是客戶端,一個前端功能的實現流程與邏輯,有時候只有客戶端的RD才清楚,從某種意義來說,客戶端算是接口的需求方。
  • C++中是如何調用C接口的?
    前言如何在C++代碼中調用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調用不就可以了?這裡我們先按下不表,先看看C++如何調用C代碼接口。C++如何調用C接口為什麼會有這樣的情況呢?想像一下,有些接口是用C實現的,並提供了庫,那麼C++中該如何使用呢?我們先不做任何區別對待,看看普通情況下會發生什麼意想不到的事情。
  • 亞馬遜alexaapi接口,亞馬遜聯盟api接口使用
    我這裡給大家安排一堂直播課,可以系統的幫你解決做亞馬遜的各種問題。亞馬遜alexaapi接口亞馬遜的Echo智能音箱最早發布於2014年的11月,除了能播放音頻和廣播新聞這些常規功能之外,通過內部集成的Alexa語音助手,用戶還可以跟這款音箱進行自然語言的交互,音箱可以實時響應大部分的語音命令和問題。亞馬遜一直非常重視Alexa語音平臺的發展。
  • 推薦一款接口 API 設計神器!
    API 設計神器,傳說中的,牛逼哄洪的 Swagger,它到底是什麼?它是一個圍繞 OpenAPI 規範構建的開源工具,它可以幫助我們設計、構建、記錄和使用 REST API 接口。Swagger 包含的主要套件:Swagger Editor - 基於瀏覽器的編輯器,用來編寫 OpenAPI 規範。Swagger UI - 基於 OpenAPI 規範動態生成 API 規範文檔。
  • App開放接口api安全:Token籤名sign的設計與實現
    來源:cnblogs.com/whcghost/p/5657594.html前言在app開放接口api的設計中,避免不了的就是安全性問題,因為大多數接口涉及到用戶的個人信息以及一些敏感的數據,所以對這些 接口需要進行身份的認證,那麼這就需要用戶提供一些信息,比如用戶名密碼等,但是為了安全起見讓用戶暴露的明文密碼次數越少越好
  • 如何使用 RestSharp 調用 WebAPI 接口
    這篇文章將會討論如何使用 RestSharp 去請求 Asp.NET Core 服務。實現 DefaultController打開 DefaultController.cs 文件並用下面的代碼進行替換。
  • API 接口滲透測試
    1 API 接口介紹1.1 RPC(遠程過程調用)