【问题标题】:How to set a custom content type in an Elm HTTP request如何在 Elm HTTP 请求中设置自定义内容类型
【发布时间】:2021-12-02 20:56:16
【问题描述】:

我正在探索 Elm 以在具有遵循 JSON:API 规范的 REST 后端的单页应用程序中使用。因此,所有资源都具有内容类型application/vnd.api+json,而不是通常的application/json。在 Elm SPA 中配置此内容类型的推荐方法是什么?

据我了解,当我使用Http.expectJson 作为预期响应类型时,elm/http 会自动将请求标头内容类型设置为application/json。我该如何改变呢?我是否需要编写自己的请求函数来包装Http.request?有没有更简单、侵入性更小的方法?

【问题讨论】:

    标签: http-headers elm


    【解决方案1】:

    Content-Type 标头是基于正文设置的,而不是预期的响应(例如,您可以发送 JSON 并期望字节响应,反之亦然)。当您使用jsonBody 时,该标头被设置为application/json,但如果您需要使用其他内容类型,您可以轻松使用stringBody

    import Json.Encode as Encode
    
    apiJsonBody : Encode.Value -> Body
    apiJsonBody value =
        stringBody "application/vnd.api+json" (Encode.encode 0 value)
    
    postBook : Book -> Cmd Msg
    postBook book =
      Http.post
        { url = "https://example.com/books"
        , body = apiJsonBody (encodeBook book)
        , expect = Http.expectJson GotBooks (list string)
        }
    

    【讨论】:

    • 感谢您的澄清。两个答案基本相同,但我只能将一个标记为已接受。我随机选择了我最先阅读的那个。
    【解决方案2】:

    根据您的描述,您似乎正在尝试设置发送到服务器的 HTTP 请求的 Content-Type 标头。 Http.expectJson 函数不会修改请求头。

    如果您想更改请求标头,可以使用Http.stringBody 手动设置发送到服务器的内容类型。这是此类辅助函数的一个简单示例。

    postApiJson : String -> (Result Http.Error a -> msg) -> Decoder a -> Json.Encode.Value -> Cmd msg
    postApiJson url msg decoder body =
        Http.post
            { url = url
            , expect = Http.expectJson msg decoder
            , body = Http.stringBody "application/vnd.api+json" (Json.Encode.encode 0 body)
            }
    

    【讨论】:

    • 感谢澄清并指出Expect参数对请求的内容类型没有影响。
    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 2018-05-26
    • 2011-07-24
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多