从http响应中获取标头

din*_*ina 7 elm

我是elm的新手,我有一个登录api,它在hedears中返回一个JWT令牌

curl  http://localhost:4000/api/login?email=bob@example&password=1234
Run Code Online (Sandbox Code Playgroud)

响应:

HTTP/1.1 200 OK
authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXyLp0aSI6ImefP2GOWEFYWM47ig2W6nrhw
x-expires: 1499255103
content-type: text/plain; charset=utf-8

success
Run Code Online (Sandbox Code Playgroud)

现在我试图编写一个函数,它将发送请求并从elm中的标头返回令牌

authUser =
    Http.send "http://localhost:4000/api/login?email=bob@example&password=1234"
Run Code Online (Sandbox Code Playgroud)

我该如何以简单的方式做到这一点?

Cha*_*ert 11

为了从响应中提取标题,您必须使用Http.requestexpectStringResponse函数,其中包括包含标题的完整响应.

expectStringResponse函数接受一个Http.Response a值,因此我们可以创建一个接受标题名称和响应的函数,然后返回Ok headerValueErr msg取决于是否找到标题:

extractHeader : String -> Http.Response String -> Result String String
extractHeader name resp =
    Dict.get name resp.headers
        |> Result.fromMaybe ("header " ++ name ++ " not found")
Run Code Online (Sandbox Code Playgroud)

这可以由请求构建器使用,如下所示:

getHeader : String -> String -> Http.Request String
getHeader name url =
    Http.request
        { method = "GET"
        , headers = []
        , url = url
        , body = Http.emptyBody
        , expect = Http.expectStringResponse (extractHeader name)
        , timeout = Nothing
        , withCredentials = False
        }
Run Code Online (Sandbox Code Playgroud)

这是一个ellie-app.com返回值content-type的示例作为示例.您可以替换"authorization"您的目的.


Sim*_*n H 3

我可以谦虚地建议您查看我的 elm-jwt 库以及那里的get函数吗?

Jwt.get token "/api/data" dataDecoder
    |> Jwt.send DataResult
Run Code Online (Sandbox Code Playgroud)

JWT 令牌通常需要作为Authorization标头发送,此函数可帮助您创建一个可以传递给Http.send或的请求类型Jwt.send