Изменить 22/4/2019: Я обновил этот ответ для версии 2.0+ http-extras, в которой есть некоторые изменения API. Спасибо Беренд де Бур за то, что указал на это!
Ответ ниже дает решение с использованием пакета, который я написал (согласно запросу), но вам не нужно использовать пакет! Я написал всю статью о том, как извлечь подробную информацию из HTTP-ответа, она включает в себя несколько примеров Элли, которые не требуют пакета, а также пример, который использует пакет.
Как упоминал Франческо, я создал пакет именно для этой цели, используя похожий подход, описанный в вопросе: https://package.elm -lang.org / packages / jzxhuang / http-extras / latest / .
В частности, модуль для использования Http.Detailed
. Он определяет тип ошибки, который сохраняет исходное тело при ошибке:
type Error body
= BadUrl String
| Timeout
| NetworkError
| BadStatus Metadata body Int
| BadBody Metadata body String
Сделать запрос так:
type Msg
= MyAPIResponse (Result (Http.Detailed.Error String) ( Http.Metadata, String ))
sendRequest : Cmd Msg
sendRequest =
Http.get
{ url = "/myapi"
, expect = Http.Detailed.expectString MyAPIResponse
В вашем обновлении обработайте результат, включая декодирование тела, когда оно имеет статус BadStatus:
update msg model =
case msg of
MyAPIResponse httpResponse ->
case httpResponse of
Ok ( metadata, respBody ) ->
-- Do something with the metadata if you need! i.e. access a header
Err error ->
case error of
Http.Detailed.BadStatus metadata body statusCode ->
-- Try to decode the body the body here...
...
...
Спасибо, Франциско, за то, что обратились ко мне по этому поводу, надеюсь, этот ответ поможет всем, кто сталкивается с той же проблемой, что и ОП.