2015-12-12 2 views
3

Я работал в двух разных проектах, чтобы реализовать привязку клиента к инструменту Pivotal Tracker. One project использует wreq library, а the other полагается на servant.Wreq или Servant для клиента http API?

Я хочу объединить оба проекта, но я не уверен, какой подход к дизайну использовать. Таким образом, вопросы, которые помогли бы мне разобраться в этом являются:

  1. Есть ли какие-либо конкретные преимущества определения моего API как тип (помимо удобочитаемости)?

  2. Какая обработка ошибок будет генерировать меньше кода для пользователей библиотеки, EitherT ServantError IO() службы или стиля исключения wreq?

+0

У wreq есть несколько нерешенных проблем, поддерживающих последний http-клиент и штабелирование в ночное время на сегодняшний день. слуга более современен. – user239558

ответ

5

Оба используют http-client под капотом.

В Haskell, наиболее потребляющей частью написания привязок web-api, являются определения данных и спецификация сериализации JSON. В реализации wreq используются линзы, wreq - это объектная HTTP-библиотека.

После этого, вы хотели бы, чтобы предоставить некоторые функции (с помощью IO) для извлечения данных из правильных конечных точек:

getStory :: Options -> Int -> Int -> IO Story 
getStory options projectId storyId = 
    getOne options $ "/projects/" ++ show projectId ++ "/stories/" ++ show storyId 

или

type API = "services" :> "v5" :> "stories" 
      :> Header "X-TrackerToken" Text 
      :> Capture ":storyId" StoryId 
      :> Get '[JSON] Story 

story :: Text -> StoryId -> EitherT ServantErr IO Story 
story :<|> ... = client api ... 

Они не так различны. С wreq (или http-client напрямую) вы, вероятно, реализуете некоторую вспомогательную функцию (например, getOne), чтобы делать выборки; когда с servant вы получите его «бесплатно».

+0

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

Смежные вопросы