2013-07-04 2 views
2

Есть ли лучший способ выполнить этот пример? Я имею в виду, мой простой пример ниже хорошей практики, а также как он используется в реальном мире? Я знаю, что моя немного слишком простая, но я пытаюсь получить базовую идею веб-сервисов.Получение ответа от сервера путем прохождения параметров

Благодаря

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 запросов, нет ничего плохого в том, что у вас есть per se. Есть ли лучше путь? Есть, конечно, разные способы, которые могут считаться лучшими в зависимости от того, что вам нужно делать. Поскольку вы пытаетесь получить основную идею веб-сервисов, я обращусь к этому.

Существует множество способов реализации веб-сервисов, большинство из которых оказываются излишними для основных приложений. Я думаю, что проще всего понять и реализовать 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" 
} 

Response без ошибок

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

Теперь клиентский код, если можно определить произошла ошибка и что это в виде.С помощью этого простого API я знаю, что если произошла ошибка, ответ будет строкой, описывающей ошибку. Если ошибок не было, я могу предположить, что ответ будет массивом. Что касается реальных данных, я обычно использую объекты или ассоциативные массивы, так что каждая часть данных имеет метку.

Для получения дополнительной информации см: How to Design a Good API & Why it Matters (видеолекцию)

В конце концов, Есть много способов, чтобы построить веб-сервис, так как есть люди, чтобы построить их. best путь зависит от ваших потребностей и того, насколько легко/сложно будет обновлять и поддерживать его в будущем.

+0

Благодарим вас за подробный ответ. Я посмотрю в REST. Что произойдет, если я не использую 'header ('Content-Type: application/json; charset = utf-8');'? Какая разница? – BentCoder

+0

Тип контента сообщает клиенту, какую информацию он якобы получает. Я думаю, что [этот ответ SO] (http://stackoverflow.com/a/9254967/911182) объясняет это лучше, чем я мог в комментарии. – Herbert

Смежные вопросы