Почему нет средней точки между "do_GET" и полноценной маршрутизацией в стиле рельсов?
Я ищу выставить ряд услуг в Интернете. Будут статические веб-страницы с кодом JavaScript на основе jQuery, который обращается к этим сервисам, а также будут все виды приложений, которые могут получить доступ к этим сервисам. (Или никто не будет заботиться; это тоже вполне возможно:-)
Каждый сервис будет четко определен как набор методов, которые действуют на некоторое количество входных параметров и возвращают некоторое количество выходных параметров. В большинстве случаев это REST, за исключением понятия "идентичность" - эти сервисы требуют некоторого входа в систему, и вход в систему настраивает вас на то, какие методы для каких сервисов вам разрешено использовать, и какие конкретные объекты Вы можете обратиться с помощью этих методов.
В идеале я хочу представить сервисы, используя JSONP, чтобы сделать сервисы легкими для использования в межсайтовом режиме - эти статические веб-приложения не обязательно должны обслуживаться из домена моих серверов приложений.
Набор типов данных довольно прост: varchar (255 символов), текст (8191 символов), id (32 символа, ограничение идентификатора в стиле C), double, long (трудно сделать в JavaScript), bool, datetime, email (varchar соответствует regex) и url (varchar соответствует regex), вероятно, будет достаточно в течение очень долгого времени.
Я хочу, если возможно, реализовать эти сервисы, используя технологию сервисов приложений, которая может масштабироваться на многопоточных ядрах - сегодня на простых серверах среднего уровня стандартно 24 потока. Придерживаться Python или Node.js было бы неудобно из-за отсутствия поддержки потоков. Кроме того, я хотел бы, чтобы типизация была статической, потому что я считаю, что статическая типизация предотвращает определенный класс ошибок, который также связан с Python, Node.js, PHP и Ruby.
Я также хочу служить в Linux. Это довольно сложное требование:-)
В мире статических языков на самом деле существует только несколько серверных сред или подходов. Есть HttpListener с Mono. Есть пристань с Java. Есть несколько других. Есть также несколько более глубоких фреймворков, которые требуют больше ресурсов, чем хотелось бы - J2EE, ASP.NET и т. Д. (В динамическом мире у вас есть Cake.PHP, Rails, Django и т. Д. И т. Д.)
Итак, в лучшем из миров, я бы хотел, чтобы URL GET /foo/bar? Arg1=2&arg2=xyzzy отображался на объект, который я пишу, типа foo, метод bar, принимающий аргументы arg1 и arg2 типа int и string (сказать). Я хочу, чтобы серверный клей, который находится между HTTP GET и методом объекта, делал две вещи: 1) Контроль разрешений (каждый метод может иметь одно или несколько необходимых разрешений) 2) Проверка типа (каждый аргумент должен быть проверен на соответствие ожидаемому и приведен из формат строки URL к нативному типу) Как только метод возвращает одно или несколько значений (пары ключ / значение), клей должен убедиться, что возвращаемые значения также соответствуют спецификации, преобразовать в надлежащий JSON и должен позаботиться о возвращении соответствующий результат ошибки, если в коде возникло исключение.
Я искал решения такого типа, но все решения, которые я нашел, довольно далеки. JSP и ASP начинаются с предположения HTML - я обычно генерирую JSON, который также не интегрируется с синтаксисом (мягко говоря). JSPX, а также ряд других технологий (HttpListener, CGI, Python Twisted, ...) все останавливаются на уровне "do_GET" - нет отправки в объекты, нет контроля разрешений, нет проверки типов. Тем не менее, все высокоуровневые фреймворки добавляют намного больше к этому и часто добавляют сложную маршрутизацию, которая мне не нужна, и, как это часто бывает, все равно не выполняет проверку разрешений, а вместо этого оставляет это как нечто Вы должны написать вручную в каждой реализации функции.
Я думаю, что ближе всего к тому, что я хочу, это Thrift. Тем не менее, он по-прежнему не выполняет проверку разрешений, и поддержка "PHP-сервера", по-видимому, представляет собой глупый процесс PHP-клиента, который прослушивает порт 80 вместо интеграции с Apache, и он не настроен на поддержку JSONP.
Я что-то пропустил? Существует ли какая-либо (предпочтительно статически типизированная и поддерживающая несколько потоков) серверная технология, которая будет выполнять проверку типов и проверку разрешений, а также простую диспетчеризацию объекта-метода без множества других ненужных действий и может вызываться из (и отвечать к) JSONP? Должен ли я продлить Thrift? Добавление ограничений разрешений для каждого метода было бы довольно существенным расширением, но по крайней мере я бы получил другую поддержку, которую имеет Thrift. (И тогда мне придется добавить поддержку JSONP и...)
2 ответа
На самом деле не существует хороших рамок на нужном уровне для этого. Существующие фреймворки либо слишком низкого уровня (думаю, что boost::asio), либо слишком высокого уровня (думаю, торт, рельсы и т. Д.). Ближайший вариант, вероятно, Erlang/WebMachine. Я предполагаю, что причина этого заключается в том, что большинство веб-приложений в конечном итоге имеют общий набор требований более высокого уровня, которые затем переходят в какую-либо веб-инфраструктуру, тем самым поднимая ее с уровня, на который я рассчитываю.
Существует ли какая-либо (предпочтительно статически типизированная и поддерживающая многопоточность) серверная технология, которая будет выполнять проверку типов и проверку разрешений, а также простую диспетчеризацию объекта-метода без множества других ненужных вещей, мешающих работе?
Scala (статика, актеры для потоков / параллелизма и отправки, без суеты) + экономия.
Я полагаю, что последний проект имеет поддержку javascript (не уверен насчет JSONP).
Что касается аутентификации, см. Мой ответ на этот вопрос.