Pull to refresh

Comments 25

Не знаю, лично мне было интересно. Никогда раньше не задумывался, как пишутся API
Если я не ошибаюсь, то у вас в реализации существует серьезная уязвимость. При проверке существует ли метод в теле вы не проверяете входные переменные.

Например, при попытке вызова такого URL-а, для существующего контроллера:
www.example.com/api/?apitest.getApiEngineByName=test будет заинклуден файл test.php.
А если еще включена настройка allow_url_fopen, то можно будет вообще загрузить и подключить какой-нибудь шелл.
Я с вами согласен здесь совершенно отсутствует реализация защиты. Собственно это планирую внедрить в следующей доработке.
Однако на ваш пример отвечаю: в ответ на запрос
www.example.com/api/?apitest.getApiEngineByName=test
Сервер вернет вот такой ответ:
{«response»:{},«error»:«Method getApiEngineByName does not exist»}
«класс для констант» это нечно :D
Которые, внезапно, не константы, а статические переменные O_o
Если вы про это ru.wikipedia.org/wiki/PHP_Data_Objects, то слышал, слышал.

Но наверное не очень понял к чему это?

HP Data Objects (PDO) — расширение для PHP, предоставляющее разработчику простой и универсальный интерфейс для доступа к различным базам данных.

Я не ставил целью написать API для работы с БД. Например картинка в последнем методе не делает запросов к базе.
>>MySQLiWorker.php Класс-одиночка для работы с базой. В прочем это обычный одиночка — таких примеров в сети очень много.
O_o? Вы серьезно собираетесь продолжать это «API»?
Да. Для моих целей его вполне достаточно (возможно и кому-нибудь еще пригодится).
Хотя вот все же не пойму, вот кусок из PDO Manual
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach ($conn->query($sql) as $row) {
print $row['name']. "\t";
print $row['color']. "\t";
print $row['calories']. "\n";
}

так в чем же разница от MySQLi?

MySQLi делает тоже самое.
— все равно писать свои запросы
— все равно делать выборки и обрабатывать их
— все равно есть Statement
Спасибо.
Дальше планирую написать как осуществлять взаимодействие с этим API с клиентских устройств. В таком порядке: iOS, Android, WP7.
UFO just landed and posted this here
Спасибо за ссылку кстати)
Спасибо за ссылку.

Такой стиль был навеян системой IP.Board.
А какова максимально возможная длина URL? Если надо будет передавать бинарные данные на сервер, то их придётся конвертировать в base64, а влезет ли результат в URL?
ИМХО не хорошо, что такая жесткая привязка к структуре файловой системы. Лучше было бы реализовать Front Controller. А использование mod_rewrite позволило бы сделать url более красивым ;)

Так же было принято решение, что запросы можно будет отсылать как через GET так и через POST запросы (здесь помог $_REQUEST в PHP). Такое решение позволило проводить тестирование API через GET запросы в любом доступном браузере.


Абсолютно непонятная мне мотивация, т.к. для тестирования запросов есть curl. А при разных типах запросов можно было бы выполнять различные действия, что логично.
В PHP5 есть классовые константы: www.php.net/manual/en/language.oop5.constants.php

Если их использовать, то следующий класс будет выглядеть читабельнее, и «константы» будут действительно неизменяемыми.
class APIConstants {

    //Результат запроса - параметр в JSON ответе
    const RESPONSE = "response";

// ... И обращаться дальше, в apiEngine.php, можно следующим образом:

   $response = APIConstants::RESPONSE;



Постараюсь в свободное время pull request сделать.
Ещё очень важный момент: в запрос желательно включать версию API (и поддерживать несколько одновременно, естественно)
По большему счету, API с выводом в JSON не отличается от обычного HTML вывода, а посему можно использовать любой фреймворк, только вместо сессий использовать базу данных и передаваемый токен для аутентификации и авторизации.
*facepalm.jpg* — не зря нас (похапэшников) троллят…
Кстати, с iOS 5 появилась нативная поддержка JSON.
На серверной стороне файл index.php — производит парсинг переданных параметров. Index.php берет всегда только первый элемент из списка переданных параметров $_REQUEST — это значит что конструкция вида www.example.com/api/?apitest.helloWorld={}&apitest.helloWorld2 — произведет вызов только метода helloWorld в apitest. Вызова же метода helloWorld2 непроизойдет


Сломал мозк
Вот сижу и пытаюсь понять а в чем же разница (концептуально) между PDO и MySQLi.

Тут же на хабре нашел интересную статью
habrahabr.ru/post/141127/
И первый же момент
Выбирать нужно было между MySqli и PDO. После не очень длительного изучения решил остановиться на MySqli, так как, как мне тогда казалось, он полностью идентичен PDO, за исключением того, что нет возможности отказаться от MySQL в пользу чего-то другого. Как я напишу ниже это не совсем так, минимум одно заметное отличие есть.

MySqli рекомендован к использованию самими разработчиками PHP.[1]

Вот и не пойму? Это холивары такие: мы за PDO, MySQLi — г-но?

Кстати полностью согласен с комментом:
habrahabr.ru/post/141127/#comment_4718702
Sign up to leave a comment.

Articles