You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elm HTTP请求中设置自定义Content-Type适配JSON:API规范

Elm对接JSON:API规范后端的Content-Type配置方案

首先澄清基础逻辑:elm/http 2.x 版本中,Http.expectJson 仅会自动设置请求的Accept头为application/json,并不会主动设置请求的Content-Type头,请求Content-Type由构造Http.Body时的参数决定,比如默认的Http.jsonBody会固定带入application/json的Content-Type。


最低侵入实现方案(无需封装全局请求函数)

不需要强制重构现有请求逻辑,仅需两步修改对应配置即可适配,侵入性极低,适合仅部分接口对接JSON:API后端的场景:

  • 替换默认Http.jsonBody为自定义JSON:API请求体构造函数,直接指定正确的Content-Type:
import Json.Encode as Encode
import Http

jsonApiBody : Encode.Value -> Http.Body
jsonApiBody encodedValue =
    Http.stringBody "application/vnd.api+json" (Encode.encode 0 encodedValue)

原有请求中用到Http.jsonBody yourEncodedData的地方,直接替换为jsonApiBody yourEncodedData即可。

  • 新增Accept请求头覆盖默认值,告知后端客户端期望的响应格式:
    在请求的headers配置项中新增一行即可:
Http.post
    { url = "/your/endpoint"
    , body = jsonApiBody yourEncodedData
    , expect = Http.expectJson YourMsg yourDecoder
    , headers = [ Http.header "Accept" "application/vnd.api+json" ]
    , timeout = Nothing
    , tracker = Nothing
    }

全局封装方案(适合全项目统一对接JSON:API后端)

如果项目所有接口都遵循JSON:API规范,可以封装一层通用请求函数,统一处理公共配置,避免每次手动写头和自定义body:

jsonApiRequest :
    { method : String
    , url : String
    , body : Http.Body
    , expect : Http.Expect msg
    , timeout : Maybe Float
    , tracker : Maybe String
    } -> Cmd msg
jsonApiRequest opts =
    Http.request
        { method = opts.method
        , url = opts.url
        , headers = [ Http.header "Accept" "application/vnd.api+json" ]
        , body = opts.body
        , expect = opts.expect
        , timeout = opts.timeout
        , tracker = opts.tracker
        }

后续业务代码直接调用jsonApiRequest即可,无需重复配置公共参数。

内容的提问来源于stack exchange,提问作者Ulrich Schuster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:45:01