Я разработал очень быстрое и простое приложение 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 (eg UserController) via __autoload // or to a file (eg user.php) via include, and pass id and content_type as params
4 – СТАТИСТИКА Просто заявлено, что сервер не поддерживает «состояние» для клиента. Нет требований для хранения сеанса или состояния. Каждый запрос представляет собой полную транзакцию. Т.е. если я GET user / 1, сервер не запомнит, что я сделал это, а будущие запросы не будут зависеть от предыдущих или не будут затронуты предыдущими.
Если вы примете эти стандарты, поздравляйте, вы создали службу RESTful!
«RESTful» – это широкая концепция, и есть «RESTfulness». Википедия – хорошее руководство здесь
Вот некоторые более высокоуровневые характеристики, которые не рассматриваются в другом ответе (что тоже хорошо):
Content-Location
. Accept
и content-type
. if-*
), вы даже можете реализовать оптимистичный контроль параллелизма. 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, клиенту, использующему службу отдыха, нужно только следить за ссылками (не создавать ссылки), чтобы получить доступ к другим связанным ресурсам. Вы даже можете документировать доступные методы, которые вы можете использовать для управления ресурсом – создавать, обновлять, удалять и т. Д.