Я разработал очень быстрое и простое PHP-приложение для чтения классифицированных объявлений из XML файла и позволяющее пользователю выполнять CRUD-операции (это было домашнее задание).
Теперь мне поручено разработать это приложение для службы RESTful. У профессора, по-видимому, нет никакого опыта работы с услугами RESTful, потому что он сказал, что мое приложение было найдено для передачи следующего задания, когда мои исследования показывают, что он действительно не выполняет все требования RESTful.
Независимо от того, я хочу сделать это правильно для учебных целей, даже если я могу передать свое старое задание и получить хороший класс. У меня возникли проблемы с обучением тому, с чего начать; Я точно не знаю, что такое служба RESTful.
Я думаю, что лучший способ получить совет - отправить образец кода из моего предыдущего задания, чтобы посмотреть, как я обрабатывал вещи и как мне нужно обрабатывать вещи.
Например, вот как я создаю новые объявления.
create.php
//Basically just a list of <INPUT TYPE = "text" NAME = "something"> in the <body> fields
CreateSuccess.php
<html><head><?php $simplerXML = simplexml_load_file('file.xml');
//Generate the basic ad information
$newAd = $simplerXML->addChild('advertisement','');
$newAd->addAttribute('category', $_POST["category"]);
$title = $newAd->addChild('title', $_POST["title"]);
$title->addAttribute('ID', $_POST["ID"]);
$pageTitle = $newAd->addChild('pagetitle', $_POST["pagetitle"]);
//etc, for all the SUBMIT boxes
//save the XML
$simplerXML->asXML('file.xml');
echo "<script type='text/javascript'>
//redirect back to ad listing page
window.onload = function () { top.location.href = 'ads.php'; };
</script>";
?></head>
<body></body></html>
Я также использую параметры URL для действий RUD. Я слышал, что параметры URL не разрешены?
Спасибо.
EDIT: Итак, инструкция SWITCH, идет ли она в файл index.php? И тогда каждый случай вызовет функцию, т.е. CreateXML для метода POST? Тогда нужны ли ему параметры типа объекта, идентификатора объекта и типа содержимого? Как мне получить значения для обновления XML, просто я отправил его в файл Create.php, содержащий список полей ввода?
Если ваша служба поддерживает все операции CRUD, всегда рекомендуется реализовать интерфейс RESTful. Это не сложно. Я изложил некоторые основы ниже.
Служба RESTful просто выполняет несколько действий:
Идея состоит в том, чтобы свести к минимуму развитие пользовательских сообщений для этих вещей, которые уже определены в спецификации HTTP.
1 - МЕТОД ЗАПРОСА
4 метода запросов HTTP, которые необходимы для поддержки службы RESTful:
и вы можете опционально поддерживать
Вы можете сопоставить их непосредственно с вашими действиями CRUD следующим образом:
Чтобы сделать это, правильно запрограммируйте запросы с помощью простого маршрутизатора метода запросов следующим образом:
switch ($_SERVER["REQUEST_METHOD"]) {
case "POST":
// Create action
break;
case "GET":
// Retrieve action
break;
case "PUT":
// Update action
break;
case "DELETE":
// Delete action
break;
}
2 - КОД СОСТОЯНИЯ Вы также должны использовать коды статуса HTTP из своей службы для передачи статуса клиенту, например:
Чтобы сделать это, просто добавьте ответ с соответствующим заголовком HTTP-заголовка, например:
header("Status: 500 Internal Server Error");
Здесь вы можете ссылаться на полный список реализованных кодов состояния HTTP: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
3 - URI Для URI службы RESTful обычно следуют принципу "сверху вниз" для категориального наименования, например
/object_type/id.content_type
Примеры:
POST /user
PUT /user/1
GET /user/1.json
GET /user/1.html
Вы можете реализовать очень рудиментарный RESTful-маршрутизатор для вышеуказанного соглашения с использованием Apache с mod_rewrite
в файле .htaccess
следующим образом:
RewriteEngine On
RewriteRule ^([^\/]+)\/([^\.]+)\.(\w+)$ index.php?object_type=$1&object_id=$2&content_type=$3
Тогда у вас будет index.php
Найдите подходящий объект object_type и id для правильной маршрутизации, например:
$object = $_GET["object_type"];
$id = (int) $_GET["object_id"];
$content_type = $_GET["content_type"];
// Route from here to a class with the name of the object (e.g. UserController) via __autoload
// or to a file (e.g. user.php) via include, and pass id and content_type as params
4 - БЕЗОПАСНОСТЬ Проще говоря, сервер не поддерживает "состояние" для клиента. Нет требований для хранения сеанса или состояния. Каждый запрос представляет собой полную транзакцию. То есть если я GET user/1, сервер не запомнит, что я сделал это, а будущие запросы не будут зависеть от предыдущих или не будут затронуты предыдущими.
Если вы реализуете эти стандарты, поздравляйте, вы создали службу RESTful!
"RESTful" - это широкая концепция, и есть степени "RESTfulness". Wikipedia является хорошим ориентиром здесь
Вот некоторые более высокоуровневые характеристики, которые не рассматриваются в другом ответе (что тоже хорошо):
Content-Location
.Accept
и content-type
.if-*
), вы даже можете реализовать оптимистичный concurrency элемент управления.Location
и Content-Location
и списком URL-адресов, затронутых изменением.[1,2,3,4,5,6]
. Это список идентификаторов статей, но он не является самоописательным или гипертекстом - клиенту необходимо знать, что это список идентификаторов статей, и ему нужно знать, что для получения ресурса статьи он должен построить URL-адрес, например, http://example.org/articles/1".{"articles":[{"id":1,"url":"http://example.org/articles/1"},...]}
. Как и html, клиенту, использующему службу отдыха, нужно только следить за ссылками (не создавать ссылки), чтобы получить доступ к другим связанным ресурсам. Вы даже можете документировать доступные методы, которые можно использовать для управления ресурсом - создавать, обновлять, удалять и т.д.
switch
в ваш index.php, или, если вы хотите перейти на более сложную архитектуру, вы можете запустить внешний компонент маршрутизатора, который обрабатывает маршрутизацию. Разбор URI был только для справки - я не думаю, что он понадобится вам для вашего приложения. Учитывая простоту вашего приложения, вы можете просто проанализировать и направить метод запроса для редактирования вашего отдельного файла. Это все равно будет RESTful.