Как получить заголовки ответа на HTTP-запрос? - PullRequest
4 голосов
/ 01 июня 2019

У меня есть следующий код, где я делаю пост-запрос, и я установил заголовок авторизации с JWToken на моем сервере.Я хочу извлечь JWToken из заголовка ответа и сохранить его в локальном хранилище, используя порт.Как заполучить ответ?Я вижу метаданные с заголовками в типе ответа.ref - https://package.elm -lang.org / packages / elm / http / latest / Http # Response

type Msg
  = EnteredEmail String
  | EnteredPassword String
  | SubmittedForm
  | RegistrationSuccess (Result Http.Error ())


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
  case msg of

    EnteredEmail email ->
      updateForm (\form -> { form | email = email }) model

    EnteredPassword password ->
      updateForm (\form -> { form | password = password }) model

    RegistrationSuccess _->
      -- TODO save JWT in local storage on successful registration
      (model, Cmd.none)

    SubmittedForm ->
      -- TODO validate the form
      (model, postCall model)


postCall : Model -> Cmd Msg
postCall model = Http.post {
          url = "http://localhost:9000/register",
          body = Http.jsonBody (
            Json.Encode.object[
              ("age", Json.Encode.int 30),
              ("email", Json.Encode.string model.form.email),
              ("password", Json.Encode.string model.form.password)
            ]
          ),
          expect = Http.expectWhatever RegistrationSuccess
        }

1 Ответ

3 голосов
/ 01 июня 2019

Вы можете добраться до Response и заголовков, используя Http.expectStringResponse или Http.expectBytesResponse вместо Http.expectWhatever.

Вот пример, которыйопределяет вспомогательную функцию expectJWT, которая будет извлекать и возвращать заголовок Authorization или, если он не существует, возвращает BadStatus 403postCall все, что изменилось, это то, что Http.expectWhatever было заменено на expectJWT:

expectJWT : (Result Http.Error String -> msg) -> Http.Expect msg
expectJWT toMsg =
    Http.expectStringResponse toMsg <|
        \response ->
            case response of
                Http.BadUrl_ url ->
                    Err (Http.BadUrl url)

                Http.Timeout_ ->
                    Err Http.Timeout

                Http.NetworkError_ ->
                    Err Http.NetworkError

                Http.BadStatus_ metadata body ->
                    Err (Http.BadStatus metadata.statusCode)

                Http.GoodStatus_ metadata body ->
                    metadata.headers
                        |> Dict.get "Authorization"
                        |> Result.fromMaybe (Http.BadStatus 403)

postCall : Model -> Cmd Msg
postCall model = Http.post {
          url = "http://localhost:9000/register",
          body = Http.jsonBody (
            Json.Encode.object[
              ("age", Json.Encode.int 30),
              ("email", Json.Encode.string model.form.email),
              ("password", Json.Encode.string model.form.password)
            ]
          ),
          expect =  expectJWT RegistrationSuccess
        }
...