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

C++使用CURL发起POST请求时遇invalid_client错误求助

代码问题分析及修复建议

以下是你代码里的关键问题,也是可能触发{"error":"invalid_client","error_description":"Unauthorized"}(错误:无效客户端,错误描述:未授权)的原因:

  • 请求格式与Content-Type不匹配
    你设置的Content-Type是application/x-www-form-urlencoded,但构造的POST内容是JSON格式,且JSON用了单引号(标准JSON要求双引号)。OAuth2的token端点通常接受表单格式参数,应该改成grant_type=authorization_code&code=xxx&redirect_uri=https://127.0.0.1这种形式,而非JSON。

  • POST内容长度设置错误
    CURLOPT_POSTFIELDSIZE硬编码为12L,会直接截断请求体,导致API无法正确解析参数。直接删除这个设置即可,CURL会自动计算请求体长度。

  • 重复初始化CURL句柄
    代码里连续两次调用curl_easy_init(),第一次初始化的句柄被覆盖,会造成内存泄漏。删掉其中一次初始化语句。

  • 资源未清理
    请求完成后未清理HTTP头链表和CURL句柄,在curl_easy_perform(curl)执行完毕后,需要调用curl_slist_free_all(headers)和curl_easy_cleanup(curl)释放资源。

  • WriteCallback未定义
    你指定了WriteCallback作为响应写入函数,但代码中没有给出该函数的实现。如果没有正确实现,可能无法读取完整响应。参考实现如下:

    size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
        ((std::string*)userp)->append((char*)contents, size * nmemb);
        return size * nmemb;
    }
    

除代码问题外,还需确认:

  • base64Encode是否为client_id:client_secret的正确Base64编码,不能有多余空格或编码错误;
  • 你的client_id和client_secret是否与Schwab API后台配置完全一致,无拼写错误。

修复后的核心代码片段参考:

string tokens(string accessCode, string base64Encode) {
    CURL* curl = curl_easy_init();
    string readBuffer;

    if (curl) {
        // 构造表单格式的请求参数
        string postData = "grant_type=authorization_code&code=" + accessCode + "&redirect_uri=https://127.0.0.1";

        struct curl_slist* headers = NULL;
        string authorization("Authorization: Basic ");
        string authHeader = authorization + base64Encode;
        headers = curl_slist_append(headers, authHeader.c_str());
        headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");

        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_URL, "https://api.schwabapi.com/v1/oauth/token");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str());

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        CURLcode res = curl_easy_perform(curl);
        // 可通过res判断请求是否成功

        // 清理资源
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return readBuffer;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:41:19