2013-07-04 144 views
2

是否有更好的方法來完成此示例?我的意思是,我的簡單例子是在良好的實踐之下,以及它如何在現實世界中使用?我知道我的過於基本,但我試圖去理解Web服務的基本概念。通過傳遞參數從服務器獲取響應

感謝

client.php:

$word  = 'A'; 
$url  = 'http://localhost/server.php?word=' . $word; 
$data  = @file_get_contents($url); 
$result  = json_decode($data); 

echo '<pre>'; print_r($result); 

server.php:

//If user request is not valid 
if ($_SERVER['REQUEST_METHOD'] != 'GET') 
{ 
    exit(json_encode('Invalid HTTP request')); 
} 

//If URL not set with parameter(s) 
if (! isset($_GET['word'])) 
{ 
    exit(json_encode('Invalid URL parameter')); 
} 


if ($_GET['word'] == 'A') 
{ 
    $array = array('aa', 'ab', 'ac', 'ad', 'ae'); 
} 
else 
{ 
    $array = array('bb', 'bc', 'bd', 'be', 'bf'); 
} 

exit(json_encode($array)); 

回答

1

如果你只指望GET請求,沒有什麼錯與你有什麼本身。有沒有更好的方法?肯定有不同可能被視爲更好的方式取決於你需要做什麼。既然你試圖獲得Web服務的基本思想,我會解決這個問題。

有很多方法可以實現Web服務,其中大部分對於基本應用程序來說都是過度的。我認爲最簡單的理解和實現是REST。

REST是設計網絡應用程序的架構風格。 這個想法是,而不是使用諸如CORBA, RPC或SOAP之類的複雜機制在計算機之間進行連接,而是使用簡單的HTTP在計算機之間調用 。 — Learn REST: A Tutorial

也看看:

還有其他的方法(SOAP),我有沒有經驗,所以我不能聰明地談論他們或他們的優點。

接下來要考慮的是您的API。我明白你問題中的代碼是一個例子,所以我會使用它。你有什麼告訴客戶沒有關於返回的數據。它可以是一個數組或字符串。理想情況下,您可以在返回的數據周圍創建一些結構。例如,您可能會返回一個錯誤標誌,指示客戶端是否發生錯誤。

你的服務器代碼可以寫成:

<?php 
    $data = new stdClass; 
    $data->error = false; 

    if ($_SERVER['REQUEST_METHOD'] != 'GET') { 
     $data->error = true; 
     $data->response = 'Invalid HTTP request'; 
    } 

    if (!isset($_GET['word'])) { 
     $data->error = true; 
     $data->response = 'Invalid URL parameter'; 
    } 

    if (!$data->error) { 
     if ($_GET['word'] == 'A') { 
      $data->response = array('aa', 'ab', 'ac', 'ad', 'ae'); 
     } else { 
      $data->response = array('bb', 'bc', 'bd', 'be', 'bf'); 
     } 
    } 

    header('Content-Type: application/json; charset=utf-8'); 
    echo json_encode($data); 
?> 

與錯誤響應

{ 
    "error": true, 
    "response": "Invalid URL parameter" 
} 

響應沒有錯誤

{ 
    "error": false, 
    "response": [ 
     "aa", 
     "ab", 
     "ac", 
     "ad", 
     "ae" 
    ] 
} 

現在客戶端代碼可以確定是否錯誤發生了,它是什麼如。使用這個簡單的API,我知道如果發生錯誤,響應將是描述錯誤的字符串。如果沒有錯誤,那麼我可以假設響應將是一個數組。至於實際的數據,我通常使用對象或關聯數組,以便每條數據都有一個標籤。

欲瞭解更多信息,請參閱:How to Design a Good API & Why it Matters視頻講座

最終,有許多方法來建立一個Web服務,因爲有人們建立他們。 最好的方式取決於您的需求以及將來如何升級和維護它。

+0

謝謝你的詳細解答。我會研究REST。如果我不使用'header('Content-Type:application/json; charset = utf-8')會發生什麼;'?它真的有什麼不同? – BentCoder

+0

內容類型告訴客戶它應該收到什麼信息。我認爲[這個SO回答](http://stackoverflow.com/a/9254967/911182)比我在評論中可以更好地解釋它。 – Herbert

相關問題