Расшифровка байта вяза в Http.get - PullRequest
2 голосов
/ 24 февраля 2020

Я довольно новичок в вязе и застрял с проблемой, связанной с заполнением моей модели данными из моего бэкэнда. В настоящее время я могу сделать запрос на получение сервером, который возвращает байт [] (данные представляют собой любые изображения, аудио или видео), который прекрасно работает при отображении этих данных, например, Html .img. Когда я пытаюсь использовать Http.get (sr c: https://package.elm-lang.org/packages/elm/http/latest/Http) для заполнения моей модели, требуется декодер. Проблема в том, что Bytes.Decode.bytes требует Int, чтобы знать, сколько байтов нужно декодировать. Итак, мой вопрос: есть ли какой-нибудь способ получить доступ к ширине байта при сопоставлении с шаблоном типа Http.get?

Вот простой пример моей проблемы:


import Bytes exposing (Bytes)
import Bytes.Decode exposing (Decoder, bytes, decode)
import GeneralTypes exposing (Msg(..))
import Http

getMediaFromUrl : Cmd Msg
getMediaFromUrl = Http.get
        { url = "http://localhost:8090/image/2006/aa@a.de/session"
        , expect = Http.expectBytes GetThumbnail decodeBytes
        }

decodeBytes: Bytes.Bytes -> Decoder Bytes
decodeBytes bytesToDecode= let
                fileSize =
                    bytesToDecode |> Bytes.width
              in
              Bytes.Decode.bytes fileSize
module GeneralTypes exposing (..)

import Bytes exposing (Bytes)
import Http

type Msg = GetThumbnail (Result Http.Error Bytes)

1 Ответ

4 голосов
/ 25 февраля 2020

Функция expectBytes требует, чтобы вы указали байтовый декодер, что полезно, если вы сразу хотите преобразовать байты во что-то более значимое в вашем коде.

Если, однако, вы хотите сохранить raw Bytes в вашем приложении без необходимости клонировать или иным образом читать байты в настоящее время, вы можете найти expectBytesResponse более полезным. Он имеет подпись:

expectBytesResponse : (Result x a -> msg) -> (Response Bytes -> Result x a) -> Expect msg

Это не принимает декодер в качестве ввода. Он принимает две функции, которые позволяют вам преобразовать Response Bytes в Result, и другую функцию (первый аргумент), которая позволяет вам преобразовать Result в Msg. На каждом из этих этапов вы можете сохранить исходную ссылку Bytes, чтобы потом делать это по своему усмотрению.

Однако вам придется вручную обрабатывать больше сценариев ответа HTTP ios, но по крайней мере, вы получаете полный контроль над тем, что делать со своими байтами.

...