Использование чистых URL в RESTful API - PullRequest
35 голосов
/ 28 ноября 2011

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

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

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

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

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

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

Ответы [ 3 ]

58 голосов
/ 28 ноября 2011

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


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


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

7 голосов
/ 18 сентября 2015

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

0 голосов
/ 21 июня 2019

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

RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1&para2=$2 [NC]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...