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

