调用Discord API时提示请求体含无效JSON的问题求助
解决Discord API PUT请求「请求体包含无效JSON」错误
你遇到的问题是因为调用Discord的PUT /guilds/{guild.id}/members/{user.id}接口时,未提供符合要求的JSON请求体。该接口要求必须携带包含用户授权信息的请求体,仅设置请求头会导致JSON格式校验失败。
解决步骤:
- 确认接口必填参数:该接口必须传入
access_token(用户的Discord OAuth2访问令牌),该令牌需要拥有guilds.join权限。 - 在请求中添加JSON格式的请求体,使用HTTP客户端的
json参数(以Guzzle Client为例,该参数会自动将数组编码为JSON并设置正确的Content-Type请求头)。
修正后的代码示例:
try { $join = new Client(); // 构造请求体,access_token为必填项 $requestBody = [ 'access_token' => $socialUser->discord_access_token, // 替换为用户的Discord OAuth2访问令牌 // 可选参数(按需添加) // 'nick' => '用户自定义昵称', // 'roles' => ['目标角色ID1', '目标角色ID2'] ]; $joinData = $join->put( $this->baseURL . "guilds/" . $this->tokenData['serverId'] . "/members/" . $socialUser->id, [ 'headers' => ['Authorization' => 'Bot ' . Discord::$botToken], 'json' => $requestBody // 自动处理JSON编码与Content-Type ] ); // 验证响应状态码 if ($joinData->getStatusCode() === 200) { // 成员添加成功逻辑 } } catch (Exception $th) { dd("join Error :" . $th->getMessage()); }
额外注意事项:
- 确保机器人账号拥有
MANAGE_ROLES或CREATE_INSTANT_INVITE权限,否则会触发权限不足错误。 - 如果手动构造请求体,需使用
json_encode()编码数组,并在请求头中保持Content-Type: application/json,示例:'body' => json_encode($requestBody), 'headers' => [ 'content-type' => 'application/json', 'Authorization' => 'Bot ' . Discord::$botToken ]
内容的提问来源于stack exchange,提问作者Md Mridul
相关产品推荐
相关产品推荐

