Подтвердить что ты не робот

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

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

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

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

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

  • Можно ли пересылать все запросы только одному script, если да, как это сделать извлекать полезную информацию из структуры чистого URL-адреса ($ _GET ['url_structure'])?

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

4b9b3361

Ответ 1

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


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


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

Ответ 2

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

Ответ 3

Попробуй это:

RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1&para2=$2 [NC]

Ответ 4

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