Подтвердить что ты не робот

Haskell как сервер REST

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

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

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

Поиск hackage не дал мне много советов.

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Мой маленький пример REST (или resful server). (хорошо, может быть, пример не является реальным спокойным сервером, но он показывает, как вы можете обрабатывать запросы 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"

Ответ 3

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

Ответ 4

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

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

Существует также порт Ruby-On-Rails. Turbinado или что-то в этом роде.

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

Удачи!

Ответ 5

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

Ответ 6

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

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