LINUX.ORG.RU

HTTP client library for Haskell

 , ,


0

1

Решил поискать более или менее стандартный, стабильный http-client под haskell и приуныл.

http://hackage.haskell.org/package/HTTP - первое, что нашёл. Говорят, не поддерживает https. По мне так fail. Пока он мне не нужен, но вдруг понадобится, и придётся всё переписывать под другую библиотеку - по мне так себе затея.

http://www.serpentine.com/wreq/ - сайтик красивый. Видно, какая-то модная штуковина. Явно сторонняя (а встроенного в язык или в стандартную библиотеку, вроде как в python http.client/urllib ничего и нет, ладно). Что не нравится - какие-то линзы, и я пока не понял, зачем. Более того, я пока не понял, что вообще за штука эти линзы, и для чего они. Судя по всему http://habrahabr.ru/post/190442/ что-то превращающее чистый функциональный haskell в императивщину. ШТОА? зачем?...

http://hackage.haskell.org/package/http-conduit ещё один вариант, на stack over flow его похвалили. Брать его?

Что нужно: простенькие клиентские запросы (серверная часть не нужна), которые вытягивают XML (rss/atom feed), разбирают, и потом отправляют ещё парочку запросов (возможно, GET/POST) на другой сервак. Была бы кстати поддержка oauth2, но с этим, я думаю, и сам справлюсь. Асинхронность не нужна, думаю, от неё тут пользы не будет. Алгоритм = запрос1 + обработка + запрос2, параллельно запросы слать мне не надо.

P.S. Хочется написать по возможности то, что не перестанет работать, скажем, года через 3-4, когда вдруг какую-то из библиотек выкинут из-за кривости (например). И скомпилируется более новым ghc (хотя тут бояться вроде нечего)

★★★★★

Последнее исправление: BattleCoder (всего исправлений: 1)

http-conduit - был норм, хоть и зависимостей много тянет.

но wreq использует http-client [http://hackage.haskell.org/package/http-client], который написан тем же автором, что и http-conduit и написано что (This codebase has been refactored from http-conduit.).

Что что я бы взял wreq/http-client.

qnikst ★★★★★
()

Я бы использовал http-conduit с xml-conduit.

anonymous
()

1) HTTP ещё не работает толком под Windows (с кодировками).

2) wreq это линзы, соответственно заумный интерфейс и куча смешных зависимостей.

3) wreq основан на http-client, который образовался из http-conduit — он тоже от неё зависит (вместе с http-client-tls). Так что если не wreq, то http-conduit (http-conduit-browser, если нужно). Хотя теперь это кондуиты и заумный интерфейс :)

4) Как вариант — написать на C/C++ и подключиться через ByteString.

motto
()
Ответ на: комментарий от anonymous

http://www.reddit.com/r/haskell/comments/23q8kc/wreq_a_capable_new_http_clien...

Это я так, но только в хаскеле при установке, кхм, HTTP клиента можно полюбоваться на зависимости вида «профункторы», «бифункторы», «обходимые функторы" и «дуальные им дистрибутивные функторы» «комонады», «свободные монады», «контравариантность», «полугруппы» и «полугруппоиды», наконец :)

motto
()
Ответ на: комментарий от motto

Это не проблема Хаскеля, что в беспомощных языках нельзя написать Профунктор.

anonymous
()
Ответ на: комментарий от anonymous

По мне так для моей задачки небольшой лучше всего подошёл бы python. На java на коленке я бы тоже смог бы быстро нацарапать что-то готовое.

Цель - поупражняться в программировании на haskell, закрепить кое-какие знания, освежить другие, узнать что-то новое.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

http-client не умеет HTTPS, для этого нужен http-client-tls — это низкоуровневые либы, вместо них нужно использовать основанные на них:

2) wreq

3) http-conduit, http-conduit-browser

http://github.com/snoyberg/http-client

An HTTP client engine, intended as a base layer for more user-friendly packages.

This is a mega-repo for housing the http-client family of packages for Haskell. These packages provide a low level HTTP client engine (http-client), different backends for providing SSL support (http-client-tls and http-client-openssl), and higher-level APIs for user convenience (http-conduit).

If you're just getting started, it is recommended to use http-conduit, which is documented in the Yesod book [http://www.yesodweb.com/book/http-conduit].

motto
()
Ответ на: комментарий от anonymous

Такого рода системные действия — один хрен, в остальном наличие хаскеля (скалы, питона, подставить нужное) предполагает, что HTTP это какая-то мелочь и есть код-база разной высокоуровневой логики с фактором ~10x по отношению к подобному коду на C++.

motto
()

Я для этого использовал libcurl + tagsoap + hxt. В последнем где-то были сломаны Arrow Laws, так что не советую.

fmdw
()
Ответ на: комментарий от qnikst

libcurl попадает под этот вариант, да.

Я этот враппер не использовал — когда мне нужен был REST с JSON-ом известной кодировки я взял curl-овский заголовочник и написал строк 200 на C++, объявил запросы через extern и подключил строк в 20, дальше это дело только так летит в aeson, который можно хоть линзами рассматривать, хоть в data автоматически превращать, C++ нервно курит в сторонке, JS разводит руками — «какой-такой data?» :)

@anonymous, я не про какой-то случай, а вообще — если какой-то код естественно пишется на C++, то почему бы и нет (ок, тут может быть затык с FFI у GHC, так что нативный код будет лучше, но это может быть и не принципиально). А зачем человеку хаскель и что он на нём пишет и с каким фактором это уже другой вопрос.

motto
()

Они нужны, чтобы аккуратно в функциональном стиле изменять вложенные объекты. Есть у тебя к примеру, структура «человек», в ней поле — структура «голова», в ней поле — структура «глаз», в ней поле — флоат «диаметр зрачка». Тебе надо поменять диаметр зрачка конкретному экземпляру «человека». В императивных языках ты просто сделаешь присваивание. В языках с иммутабельными переменными тебе придется страдать и выдирать и копировать все вложенные объекты ручками. Чтобы этого не делать, нужны линзы.

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

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)
Ответ на: комментарий от buddhist

Они нужны, чтобы аккуратно в функциональном стиле изменять вложенные объекты

Бред какой. И про «в функциональном стиле» (линзы во многом — имитация императивщины, некоторые ранние библиотеки даже имели констрейнт MonadState) и про «вложенные структуры» (с тем же успехом можно апдейтить и кортежи какие-нибудь).

fmdw
()
Ответ на: комментарий от fmdw

линзы во многом — имитация императивщины

Именно, потому что в нормальной функциональщине апдейты вообще не нужны. Но они не императивщина

тем же успехом можно апдейтить и кортежи какие-нибудь

Можно. Но их просто апдейтить и обычным деструктурированием-сборкой

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

Кстати, говоря про изменяемые структуры. Допустим, изменяемые переменные мне особенно не нужны. Проще говоря, мне не нужно переназначать ссылки на что-то. Но, например, mutable hash map был бы в некоторых случаях эффективнее immutable hash map, при частой вставке элементов.

Как такие вещи на haskell обходятся? Пишется нативный код на C (например), и потом подключается к haskell как библиотека? И торчит только интерфейс с функциями put/get/delete ?..

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Хороший вопрос, но я не знаю ответа, поскольку не пишу на хаскеле :) Дождемся ответа хаскелистов.

buddhist ★★★★★
()
Ответ на: комментарий от BattleCoder

В haskell вполне можно использовать мутабельные стуктуры, так то мутабельные array/vectors, естественно все операции с ними будут завернуты в IO/ST (что впрочем одно и тоже). Естественно мутабельные структуры очень печальны для GC и сильно его замедляют.

qnikst ★★★★★
()

Я бы посоветовал начать с простого HTTP. Его cabal-install юзает. Https как-нибудь добавят.

anonymous
()

content <- simpleHttp "http://..." в общем-то сделал своё дело. Да вот только кодирует русские буквы по ходу неправильно. Разобраться бы ещё, как кодировку указать.

BattleCoder ★★★★★
() автор топика

Например, когда я делаю

content <- simpleHttp "http://www.linux.org.ru"
То в получившейся ByteString я вижу символы вида \<число> вместо русских букв. Вопрос - это правильно, и я теперь должен это раскодировать, или simpleHttp надо запускать по-другому?

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

ByteString это или Raw bytes (Data.ByteString[.Lazy]) или ASCII (Data.ByteString.Char[.Lazy]), тебе нужен текст, а кодировть в него Data.Text.Encoding из пакета text. В кондуитах наверное специально обученный кондуит есть.

:m Network.HTTP.Conduit 
 q <- simpleHttp "www.linux.org.ru"
:m +Data.Text.Lazy Data.Text.Lazy.Encoding
putStrLn $ Data.Text.Lazy.unpack (Data.Text.Lazy.Encoding.decodeUtf8 q)

например

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 1)
Ответ на: комментарий от qnikst

Благодарю.

Да, сработало. Русские буквы видны. Едем дальше. :)

BattleCoder ★★★★★
() автор топика
Последнее исправление: BattleCoder (всего исправлений: 1)

Уже чуток не в тему, но какую RDBMS выбрать для простенькой встраиваемой в файл базы данных? Буквально на одну табличку. Склоняюсь к sqlite3, который на C, наверное, это и есть лучший вариант?

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от buddhist

С другой стороны, я считаю, что они вообще не нужны, а присутствие таких структур в коде на функциональном языке — признак плохого проектирования

гм, а какую структуру на примере того же человека выбрал бы ты?

qweqwe
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.