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

Swift Vapor客户端Post请求未发送Body的问题及解决咨询

问题描述

我尝试在Vapor中使用客户端的.post()请求调用外部Twitch API,代码如下:

let payload = TwitchTokenPayload(client_id: client_id,
                                 client_secret: client_secret,
                                 grant_type: "client_credentials")

req.client.post("https://id.twitch.tv/oauth2/token", content: payload)

Payload已正确遵循Content协议,但仍收到Twitch返回的400错误,提示missing Client Id。该请求在Postman中可正常运行。我注意到Vapor的Client文件中send()函数始终传递nil作为body,怀疑这是问题根源,请问有替代的解决方法吗?或者我是否应该放弃Vapor,改用标准HTTP请求实现?

解决方法
  • 修正请求体格式:Twitch的client_credentials授权接口要求请求体使用application/x-www-form-urlencoded格式,而Vapor默认会把遵循Content协议的结构体序列化为JSON,这是请求失败的核心原因。无需放弃Vapor,直接改用表单格式发送参数:

    let formData = [
        "client_id": client_id,
        "client_secret": client_secret,
        "grant_type": "client_credentials"
    ]
    req.client.post("https://id.twitch.tv/oauth2/token") { req in
        try req.content.encode(formData, as: .urlEncodedForm)
    }
    
  • 验证请求体生成逻辑:你提到的send()函数传nil大概率是误解,当使用闭包内编码内容或content参数时,Vapor会正确生成请求体。可以添加日志验证:

    req.logger.debug("Request body: \(String(data: req.body.data ?? Data(), encoding: .utf8) ?? "nil")")
    

    确认请求体是否包含正确的表单参数。

  • 额外检查项:

    • 确保client_id和client_secret变量未为空或被意外修改
    • 排查是否有中间件强制篡改请求头(比如错误设置Content-Type为JSON)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:35:54