如何在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
相关产品推荐
相关产品推荐

