Рамки веб-сервисов в haskell
Прежде всего, я довольно новичок в Haskell, но должен сказать, что я влюбился в этот язык, так как начал играть с ним. Я сделал обширные C, Java, python и perl. Хаскелл определенно растет на меня. Я написал веб-приложение/услуги в perl/python для одного из моих личных проектов некоторое время назад - мне было интересно, могу ли я переместить его в haskell в качестве забавного проекта и сделать хакели хакель, чтобы увидеть, как он развивается.
Я знаю, что есть некоторые выдающиеся рамки для веб-приложений в haskell. То, что я хотел бы сделать, это иметь сервис, написанный в haskell, который будет отвечать данными в разных форматах (SOAP, REST-xml, REST-json). Я бы использовал javascript для сборки DOM и т.д. Итак, мой вопрос: существуют ли библиотеки, которые я мог бы использовать для преобразования формата данных "на лету"? Или с учетом сценария, как бы вы это сделали в haskell?
Я не играл с этим проектом с 2008 года, и моя первоначальная мысль заключалась в том, чтобы использовать apacheCXF из сообщества java и кодировать все это в java. Но я бы хотел сделать это в Хаскелле. Любые подсказки?
Ответы
Ответ 1
Я написал что-то подобное, используя Happstack.
То, что я сделал, это создать тип для представления всех возможных ответов моего веб-приложения.
data AppResponse = Foo String Int | Bar [String] | etc
затем написал мои обработчики для возврата значений этого типа:
home :: ServerPart AppResponse
user :: UserId -> ServerPart AppResponse
и т.д.,
Затем я написал функции, которые отображали бы ответ в разных форматах:
jsonResponse :: AppResponse -> JSON
xmlResponse :: AppResponse -> XML
и др.
Затем есть простой фильтр, который смотрит на заголовок Accept
и решает, какую из этих функций преобразования использовать.
Этот подход хорош, потому что:
- большая часть кода не должна знать ничего о формате ответа (xml, json и т.д.).
- Чтобы добавить новый формат, вы просто пишете новую функцию, например,
newFormatResponse :: AppResponse -> NewFormat
. Тип AppResponse
описывает каждый возможный ответ, поэтому вам не нужно искать весь код, выясняя, какие ответы возможны даже.
Ответ 2
Существует страница haskellwiki, посвященная этой теме. Среди этих HappStack и Yesod самый зрелый. Для новичков я бы рекомендовал HappStack, так как Yesod использует довольно много магии QuasiQuotes
.
HappStack имеет только магию в этом модуле состояния. Из того, что я слышал, это будет изменено в HappStack 7, где будет изменено использование MACID-хранилища, которое намного менее волшебное и имеет меньшее количество шаблонов.
Если вам нужно что-то равное, вы должны взглянуть на Snap framework.