Haskell как REST-сервер - PullRequest
       11

Haskell как REST-сервер

26 голосов
/ 06 апреля 2010

Я хотел бы попробовать Haskell на небольшом проекте, который должен хорошо подходить для него. Я хотел бы использовать его как бэкэнд для небольшого ajax-приложения.

Бэкэнд Haskell должен иметь возможность выполнять аутентификацию (базовую, форму, что угодно, ...), отслеживать сеанс пользователя (там не так много данных, кроме имени пользователя) и отправлять запрос обработчикам на основе uri и типа запроса. Он также должен иметь возможность сериализации ответа в формате xml и json, в зависимости от параметра запроса.

Полагаю, что обработчики идеально подходят для Haskell, поскольку сервис в основном не имеет состояния, но я не знаю, с чего начать всю оставшуюся историю.

Поиск взлома не дал мне много подсказок.

Было бы предпочтительнее решение для чистого сервера haskell.

Ответы [ 7 ]

16 голосов
/ 07 апреля 2010

Я недавно написал качественный веб-сервис для внутреннего использования.Я использовал следующие пакеты:

  • CGI & FastCGI - для базового интерфейса веб-сервера
  • UrlDisp -для диспетчеризации на основе URL
  • HDBC & HDBC-mysql - для доступа к базе данных
  • hexpat - для анализа XML (некоторыезапросы / ответы были основаны на XML)
  • парсек - для разбора файла конфигурации (на стороне сервера)
  • двоичный & / или cereal - для разбора двоичных данных (некоторые запросы / ответы основаны на двоичном коде) (хотя я бы, вероятно, использовал attoparsec сейчас)

Кроме того, для другого проекта,Я также использую:

  • xhtml - библиотека комбинаторов XHTML

Ни один из этих компонентов самого высокого уровня не доступен для Haskell, но онивсе вполне работоспособно и достаточно полно.Я избегал высокоуровневых абстракций, поскольку мне нужно было встроить их в существующую более крупную систему, и эти пакеты работают так же, как аналогичные компоненты, которые я использовал в других проектах веб-служб.

Я запустил службу как fastCGIоснованный обработчик для Apache2 w / mod_fcgid.Это кажется надежной и эффективной установкой.Я полагаю, что сервер на основе Haskell, скомпилированный вместе со службой, может быть быстрее, но это было довольно разумно при минимальной работе.Я получаю> 1400 запросов в секунду на четырехъядерном процессоре, 2,6 ГГц, на сервере Linux.

Существует несколько чистых серверов Haskell.Большинство из них имеют свои собственные API для кода вашего сервиса, хотя все они довольно похожи.Взгляните на:

Это, вероятно, много, чтобы пережевать.Дайте нам знать, как это происходит!

Между тем, если вам нужна дополнительная информация, вы можете посетить HaskellWiki .

11 голосов
/ 21 мая 2011

Сейчас май 2011 года, просто обновление текущих тенденций.

Я думаю, что большинство веб-разработок сегодня делается с помощью Yesod или Snap-Frame. оба очень хороши и очень хорошо развиты (спасибо всем людям, которые вовлечены !!). далее также есть упаковка.

Мой маленький пример REST (или Resful сервер). (хорошо, может быть, пример не настоящий сервер отдыха, но он показывает, как вы можете обрабатывать запросы GET / PUT, остальное зависит от вас ..)

Если вы откроете http://localhost:8000/mytest в браузере, появится сообщение «Получить запрос». Если вы делаете запрос PUT с помощью rest-клиента (также для localhost: 8000 / mytest), содержимое тела запроса сохраняется в "/tmp/restrq.txt".

Этот код является частью файла Site.hs Snap-Framework:

- | Constants
tempFilePath :: String
tempFilePath = "/tmp/restrq.txt"


-- | Helper Functions

-- Bytestring Conversion
strictToLazy :: B.ByteString -> BL.ByteString
strictToLazy x
  | B.null x = BL.Empty
  | otherwise = BL.Chunk x BL.Empty

lazyToStrict :: BL.ByteString -> B.ByteString
lazyToStrict = B.concat . BL.toChunks

getRequestString :: MonadSnap m => m B.ByteString
getRequestString = do message <- getRequestBody
                      return (lazyToStrict message)


-- | Action for PUT request
action :: Application ()
action = do message <- getRequestString
            liftIO $ B.writeFile tempFilePath (B8.append (B8.pack "--- REST BODY ---\n") message)

-- | /mytest (GET and PUT requests possible)
mytest :: Application ()
mytest = method GET (writeBS "Get request") <|> method PUT action


-- | The main entry point handler.
site :: Application ()
site = route [ ("/",            index)
             , ("/mytest", mytest)
             ]
       <|> serveDirectory "resources/static"
9 голосов
/ 03 июля 2012

Для сервера, который реализует JSON API, я использую scotty , который основан на WAI + Warp. Он невероятно прост в использовании, особенно если вы ранее создавали приложения с помощью Sinatra.

2 голосов
/ 13 сентября 2011

Я не уверен насчет чистых серверов, но для небольших проектов, которым не требуется полноценная веб-инфраструктура, я использую библиотеку WAI, которая также используется инфраструктурой Yesod.

В любом случае, даже если ваше приложение простое, я бы предложил настоящую платформу, потому что веб-фреймворки на Haskell, как правило, предназначены не для того, чтобы быть большой библиотекой предопределенных вещей, а только для обеспечения чистой концепции для веб-приложений, будь то простые гостевые книги или целые приложения сообщества с поддержкой AJAX.

2 голосов
/ 09 сентября 2010

Есть несколько полезных ссылок в этот вопрос «Какова экосистема для веб-разработки на Haskell?»

2 голосов
/ 06 апреля 2010

Я не уверен, насколько низко ты пытаешься идти. Если вы хотите написать свой собственный сервер, вы можете начать примерно так: http://lstephen.wordpress.com/2008/02/14/a-simple-haskell-web-server/

В качестве альтернативы, если вы ищете готовый фреймворк, вы можете попробовать HApps: http://happs.org/

Существует также порт Ruby-On-Rails. Турбинадо или что-то.

Наконец, есть несколько начинающих учебников с CGI-типами. Я использовал это: http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell (также было предложено в ответе @ mdm)

Удачи!

1 голос
/ 06 апреля 2010

Практическое веб-программирование на Haskell . Есть несколько полезных модулей, Text.XHtml и Network.CGI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...