1. 程式人生 > >HTTP協議與REST基礎介紹(下)

HTTP協議與REST基礎介紹(下)

HTTP客戶端庫

為了體驗不同的請求方法,你在客戶端需要一個支援改變請求型別的東東。不幸的是,HTTP的表單時不行的,他只能傳送GET和POST請求,真實的情況下,你可以通過一些獨立的客戶端應用程式或者javascript來完成。

在服務端程式設計之外,選擇一個好的HTTP客戶端程式語言是非常重要的。

最流行的客戶端程式就是cURL了,在上篇中我們也有講到一些簡單的命令列應用。cURL有一個獨立可執行的命令列端,也有適合各個程式的庫。通常,cURL用來在PHP中處理HTTP請求。其他的語言,比如python,有自己原生支援的東西。

開始一個例子

我們的PHP程式很簡單。我不從框架的角度來談,只是從最基本的一些功能來講述。我也不想用一些真實存在的API,比如twitter的,他經常會變化,而且也需要驗證,這樣就不能馬上用了,所以。

執行這些例項,你需要安裝PHP5,然後讓本地伺服器跑起來。也必須在5.2版本之上,這樣才有json_encode()和json_decode()函式可用。

對於伺服器端,最方便的當然還是Apache+php_mod,當然你也可以用其他的你更加熟悉的伺服器端程式。這裡還有一些轉發規則,可以讓你的應用更快的跑起來。

所有URL是/client開頭的請求都需要轉發到server.php檔案。

在Apache中,你需要啟動mod_rewrite模組,然後修改相應的配置,或者修改你的.htacess檔案。這樣server.php才能接受到所有的請求,如果你用ngnix也需要同樣的配置。

範例程式是如何工作的?

將請求用REST的方法處理有兩個關鍵點:
第一,根據HTTP請求的不同初始化不同的處理程式–即使都是同一個URL,在PHP中,有在global中有一個$_SERVER變數,可以決定使用哪種方法來發起請求。

1
$_SERVER['REQUEST_METHOD']

這個變數中的請求型別以字串形式儲存,比如’GET’,'POST’。

第二個關鍵點在於需要知道是那個URL,我們也可以使用PHP的全域性變數。

1
$_SERVER['REQUEST_URI']

這個變數包含URL中第一個/開始後面的部分(http://不算),假如主機名是’example.com’,那麼’http://example.com/’就會返回’/',’http://example.com/test/’就會返回’/test/’。

所以在這裡我們只考慮以’client’開始URL,其他的忽略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        $resource = array_shift($paths);
 
        if ($resource == 'clients') {
            $name = array_shift($paths);
 
            if (empty($name)) {
                $this->handle_base($method);
            } else {
                $this->handle_name($method, $name);
            }
 
        } else {
            // We only handle resources under 'clients'
            header('HTTP/1.1 404 Not Found');
        }

我們會有兩種輸出:

  • 是clients資源,我們返回完整的列表
  • 更多的校驗

如果還有更多的校驗項,我們假設是客戶名,當然,還需要根據方法的不同進行不同的處理,我們使用switch來做判斷:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch($method) {
        case 'PUT':
            $this->create_contact($name);
            break;
 
        case 'DELETE':
            $this->delete_contact($name);
            break;
 
        case 'GET':
            $this->display_contact($name);
            break;
 
        default:
            header('HTTP/1.1 405 Method Not Allowed');
            header('Allow: GET, PUT, DELETE');
            break;
        }

返回狀態碼

你可能注意到了,在這個例子中,使用了PHP的header()方法來處理一些奇怪的東西。header()方法用來輸出HTTP頭部資訊,並且保證相應的值是按照規範來的。頭部資訊是需要首先輸出的,所以在你做完頭部資訊處理之前不要輸出別的東西。有的時候,伺服器需要增加一些自定義的頭部資訊,這在程式碼中要註明。

heaer資訊包含一些列的東西,比如文字的編碼方式,內容元素的MIME資訊。這裡,還有HTTP的返回狀態碼。狀態碼是用來告訴客戶端這次請求的返回狀態的。通常200表示一切正常。

伺服器端應該返回最合適的狀態碼,這樣客戶端才能做相應的處理。很多對404很熟悉,當然,還有很多其他的狀態碼。

需要注意的是,這些狀態碼也不是非常的準確,這是HTTP本身的原因造成的。你應該嘗試使用最接近現實的狀態碼,但是也不用太擔心。

下面這些狀態碼,在REST中也很常用:

200 OK

表示一切正常。

201 Created

表示資源成功建立,通常是對PUT和POST請求的返回。

400 Bad Request

通常在PUT和POST請求中,表示資料沒有通過驗證等情況。

401 Unauthorized

這個返回表示要訪問的資源需要授權。

405 Method Not Allowed

這個資源不支援這種HTTP方法。

409 Conflict

表示衝突。例如你使用了兩次PUT請求建立一個資源。

500 Internal Server Error

伺服器的內部錯誤。

例項程式實戰

我們來做幾個簡單的操作來看看,我們現在要獲取jim這個客戶的資訊,所以我們發起一個GET請求:

1
curl -v http://localhost:80/clients/jim

這會顯示完整的資訊頭部。最後一行會顯示內容。在這個例子中,將會是一個包含jim的地址的JSON物件。

下面,我們還可以一次請求所有的客戶資訊:

1
curl -v http://localhost:80/clients/

還可以建立一個客戶:

1
curl -v -X PUT http://localhost:80/clients/paul -d '{"address":"Sunset Boulevard" }

然後你會得到一個包含Paul的所有客戶的列表。

最後,刪除一個客戶:

1
curl -v -X DELETE http://localhost:80/clients/anne

這時候就看不到anne的客戶資訊了。

如果你想要讀取一個不存在的客戶資訊,那麼將會返回404錯誤。如果要建立一個已經存在的客戶,那麼會返回409錯誤。

總結

需要重點記住的是,HTTP是用來給兩個沒有任何共享資源的系統通訊用的。通常,超越HTTP的部分越少,你的應用就更加易於在多個系統間執行。

使用PHP因為大家也都算熟悉。實際上,雖然PHP是WEB語言,他也不是做REST最佳選擇,比如他處理PUT的辦法就跟GET和POST很不同。最佳的PHP REST庫在Zend Framework中有。

除了PHP,你還有很多其他的選擇:

  • 很多ruby框架(RailsSinata
  • Python中對REST的支援也不錯

refer

相關推薦

HTTP協議REST基礎介紹

HTTP客戶端庫 為了體驗不同的請求方法,你在客戶端需要一個支援改變請求型別的東東。不幸的是,HTTP的表單時不行的,他只能傳送GET和POST請求,真實的情況下,你可以通過一些獨立的客戶端應用程式或者javascript來完成。 在服務端程式設計之外,選擇一個好的HTT

HTTP協議REST基礎介紹

超文字傳輸協議是網路應用基本,當你傳輸文件或者傳送ajax請求的時候都會用到。但是對於一般的web開發者來說HTTP協議並不熟悉。這篇文章會介紹一些HTTP、REST的基本原理,然後你可以用這些構建一些跨系統跨平臺的介面。 為什麼是REST REST是獨立系統間一種簡單的

Nagios監控基礎安裝監控項部署

nrpe snmp上文總結了nagios監控的基礎安裝配置,現在來總結一下Nagios監控項部署一、Nagios服務端監控部署1、Nagios服務端目錄與相關配置文件說明Nagios 安裝完成後,/usr/local/nagios/目錄下會生成 nagios 相關目錄及配置文件,默認的的配置文件在/usr/l

深度學習數學基礎介紹概率數理統計

特征 數字特征 抽樣分布 第5章 最大 中心 3.4 獨立 知識 第1章 隨機事件與概率§1.1 隨機事件§1.2 隨機事件的概率§1.3 古典概型與幾何概型§1.4 條件概率§1.5 事件的獨立性 第2章 隨機變量的分布與數字特征§2.1 隨機變量及其分布§2.2 隨機變

深度學習介紹【Coursera deeplearning.ai 神經網路深度學習】

1. shallow NN 淺層神經網路 2. 為什麼需要activation function? 如下圖所示,如果不用啟用函式,那麼我們一直都在做線性運算,對於複雜問題沒有意義。linear 其實也算一類啟用函式,但是一般只用在機器學習的迴歸問題,例如預測房價等。 3.

資料結構基礎溫故-4.樹二叉樹

上面兩篇我們瞭解了樹的基本概念以及二叉樹的遍歷演算法,還對二叉查詢樹進行了模擬實現。數學表示式求值是程式設計語言編譯中的一個基本問題,表示式求值是棧應用的一個典型案例,表示式分為字首、中綴和字尾三種形式。這裡,我們通過一個四則運算的應用場景,藉助二叉樹來幫助求解表示式的值。首先,將表示式轉換為二叉樹,然後通過

Linux 網路協議棧開發基礎—— VIDPVID

一、PVID的作用及和VID的區別        PVID和VID經常出現於二、三層交換機裡,由於PVID和VID的設定不合理,造成VLAN劃分變得混亂。        PVID是交換機上的概念,說的是進入該埠的報文如果沒有打vlan id就按PVID的值打上,VID是報文

TCP/IP協議中分包重組原理介紹 概念

 引言 分片是分組交換的思想體現,也是IP協議解決的兩個主要問題之一。在IP協議中的分片演算法主要解決不同物理網路最大傳輸單元(MTU) 的不同造成的傳輸問題。但是分組在傳輸過程中不斷地分片和重組會帶來很大的工作量還會增加一些不安全的因素。我們將在這篇小論文中討論IP分

[CentOS 7系列]用戶用戶組

linux 上一帖提到用戶與用戶組的創建,在創建的過程中,我們可以搭配很多參數,用來設置用戶賬戶的一些設置與屬性。但很多時候,我們的用戶賬戶是已經在業務中使用的。不可能去刪除用戶後重新添加。這時,就需要去直接調整已有用戶的賬戶屬性了。 在這種場景中,我們有兩種解決的方式。第一種就是改配置文件。li

提高人體骨骼建模方法介紹

3D圖形繪制軟件 人體骨骼 建模 制作醫療插圖的時候,有個全面的人體3D骨骼模型會有很大的幫助,與傳統技術相比,擁有旋轉模型,從各個角度渲染模型的技能尤為重要,還節省了大量時間。通過隱藏或剪切單個肌肉、器官和血管,它還可以用作為很多插圖的基礎,本質上是創建了不同級別的解剖。 ZB

linux的shell基礎介紹1

linux shell 8.1 shell介紹:器之間的交互1、shell是一個命令解釋器,提供用戶和機器之間的交互2、 支持特定語法,比如邏輯判斷、循環3、每個用戶都可以有自己特定的shell4、 CentOS7默認shell為bash(Bourne Agin Shell)5、 還有zsh、ksh等

linux的shell基礎介紹2

linux shell 8.6 管道符和作業控制:1、cat 1.txt |wc -l ; cat 1.txt |grep ‘aaa‘2、ctrl z 暫停一個任務3、jobs查看後臺的任務4、bg[id]把任務調到後臺5、fg[id]把任務調到前臺6、命令後面加&直接丟到後臺管道符的作用:把

第七章 : Git 介紹 [Learn Android Studio 漢化教程]

features 發布 double to do oda 日誌功能 測試 相關 rds Learn Android Studio 漢化教程 Let’s reset even further to remove all traces of your work on

Git學習0基礎

擴展 創建 不同 sheet id_rsa con 簡單 托管 讀取數據 server上的 Git - 協議 Git能夠使用四種基本的協議傳輸資料:本地協議(Loc

十三、IntelliJ IDEA 中的版本控制介紹

點擊 遠程 analysis 介紹 rem 相關 目錄 IT 默認 我們已經簡單了解了 IntelliJ IDEA 的版本控制機制,那麽接下來,就讓我們一起看看在 IntelliJ IDEA 中進行具體的版本控制操作。 標註1:Checkout from Version

html基礎用法

選中 成績 src 沒有 value orm 類型 middle str 設計表格: 1 <html> 2 <head> 3 <title>表格</title> 4

學號 2018-2019-20172309 《程序設計數據結構》第三周學習總結

num 退出 單向 隊列 就是 5.1 選擇 ati imp 教材學習內容總結 教材學習內容總結 5.1 隊列概述 隊列的元素是按照FIFO方式處理的:第一個進入的元素,也就是第一個退出的元素。 隊列的處理方式與棧相反,棧的處理方式是LIFO。 隊列中的方法有enqueu

20172310 2017-2018《程式設計資料結構》第八週學習總結

20172310 2017-2018《程式設計與資料結構》(下)第八週學習總結 教材學習內容總結 1.1、堆 堆(heap):是具有兩個附加屬性的二叉樹。一是堆是一顆完全樹(如果一棵二叉樹是平衡的,即所有葉子都位於h或h-1層,其中h為log2n, 且n是樹中的元素數目,且所有h層中的葉子都位於該

20172310 2017-2018《程式設計資料結構》第五週學習總結

20172310 2017-2018《程式設計與資料結構》(下)第五週學習總結 教材學習內容總結 第九章_排序與查詢 學習幾種排序演算法,並討論這些演算法的複雜度 9.1查詢(線性查詢與二分查詢演算法) 查詢(searching) 是在某個專案組中尋找某一指定目標元素, 或者確定該組中並不存在

20172310《程式設計資料結構》實驗二:二叉樹實驗報告

20172310《程式設計與資料結構》(下)實驗二:二叉樹實驗報告 報告封面 課程:《軟體結構與資料結構》 班級: 1723 姓名: 仇夏 學號:20172310 實驗教師:王志強老師 實驗日期:2018年11月3日-2018年11月9日 必修選修: 必修 實驗二-1-