Использование чистых URL-адресов в RESTful API

«Чистые URL-адреса», также известные как «URL-адреса RESTful», являются удобными для пользователя, чисто структурными и не содержат строку запроса. Вместо этого они содержат только путь к ресурсу.

т.е.: "http://twitter.com/users/show/"+username+".json"

Вопросы о функциональности на стороне сервера:

  1. Нужно ли мне создавать уникальный серверный скрипт API для каждого каталога?

  2. Могу ли я пересылать все запросы только одному сценарию, если да, как я могу извлечь полезную информацию из структуры «Очистить URL» ($ _GET ['url_structure'])?

  3. Почему твиттер вызывает файл .json, который, безусловно, не существует. Он должен генерироваться по запросу. Как это работает? Это заставляет меня думать, что ответ на вопрос 2 – да.

Related of "Использование чистых URL-адресов в RESTful API"

1) Нет, если вы используете RESTful framework, например RecessPHP, или если вы используете правило mod_rewrite в вашем файле .htaccess, чтобы перенаправить все запросы API в один файл PHP (известный как передний контроллер).

.htaccess

RewriteEngine On RewriteRule ^/api/ api.php 

api.php

 $request = $_SERVER['REQUEST_URI']; //this would be /users/show/abc.json 

2) Вы можете использовать модуль перезаписи apache для перенаправления всех запросов api на специальный файл PHP, который их обрабатывает. В зависимости от вашей конфигурации apache исходный запрошенный (RESTful) url будет храниться в переменной сервера в PHP, я считаю, что это $_SERVER['REQUEST_URI'] . Конечно, вы могли бы просто передать переменную $_GET[] на PHP, содержащую URL-адрес RESTful.

.htaccess

 RewriteEngine On RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2 

api.php

 $request_parts = explode('/', $_GET['url']); // array('users', 'show', 'abc') $file_type = $_GET['type']; $output = get_data_from_db(); //Do your processing here //You can outsource to other files via an include/require //Output based on request switch($file_type) { case 'json': echo json_encode($output); break; case 'xml': echo xml_encode($output); //This isn't a real function, but you can make one break; default: echo $output; } 

3) Twitter (и многие другие API) используют это, потому что это удобный способ предоставить формат, который приложение ожидает от API. Все запросы API перенаправляются на один файл PHP, который обрабатывает создание всех файлов и выводит их содержимое на выход. Файл никогда не хранится на сервере (если он не кэшируется).


Хорошие ресурсы

  • mod_rewrite, руководство для новичков
  • Создание REST API с PHP
  • Растровая инфраструктура | Учебники

Заметка о RecessPHP. Это отличный инструмент, и я бы посоветовал вам взглянуть на него (возможно, в его источнике, чтобы понять, как он обрабатывает вещи), но это говорит, что это кажется немного неуклюжим для меня. Тот факт, что имена путей написаны в специальных комментариях, кажется мне не очень-PHP. Я бы отклонился от этого, и я бы не назвал его идеальной основой, но это, безусловно, начало. Удачи!

Это сработало для меня: поместите это в файл htaccess в корень вашего сайта.

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L] RewriteRule (recipe/.*) api/app.php?request=$1 [QSA,NC,L] </IfModule> 

И затем, если вы перейдете на страницу http: // localhost / api / person / susan, вы увидите, что она приведет вас к файлу по адресу http: //localhost/api/api.php. У меня также есть страница рецепта, в которую я иду к использованию http: // localhost / recipe / edit / 2 Поместите это в файл api.php:

 <?php $requestParts = explode('/',$_GET['request']); $category = $requestParts[0]; $action = $requestParts[1]; $data = $requestParts[2]; if($category == 'recipe'){ include($_SERVER['DOCUMENT_ROOT'].'/pages/add_recipe.php'); } 

Переменные выше будут содержать категорию: рецепт, действие: добавить или изменить, а также данные, которые могут быть числом, которое является идентификатором рецепта или тем, что вы хотите. Затем внутри add_recipe.php используйте переменные, чтобы определить, редактируете ли вы или добавляете рецепт. И если вы используете api, вы можете включить разные файлы в зависимости от того, какой запрос ajax вы используете, чтобы поговорить с вашим api.

Я бы использовал структуру, такую ​​как CodeIgniter. Вам не нужен каталог для каждой части URL-адреса, вы просто используете файл .htaccess для перенаправления всех URL-адресов на определенный URL-адрес и имеете этот URL-адрес для всех действий.