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


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

Т.е.:"http://twitter.com/users/show /"+имя пользователя+".json"

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

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

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

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

 32
Author: Tyler Buchea, 2011-11-28

3 answers

1) Нет, если вы используете фреймворк RESTful, такой как 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 файл, который обрабатывает создание всех файлов и вывод их содержимого на вывод. Файл на самом деле никогда не хранится на сервере (если только он не кэширован).


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


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

 56
Author: Bailey Parker, 2011-11-28 05:34:39

Это сработало для меня: Поместите это в файл 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.

 5
Author: PHPGuru, 2015-09-18 14:49:41

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

 -4
Author: ajacian81, 2011-11-28 05:08:28