如何通过QNetworkAccessManager正确调用Yandex翻译API发送POST请求
解决Yandex翻译API Qt调用无返回数据问题
问题根源分析
你的代码存在三个核心问题,导致无法获取API响应:
- 错误使用QHttpMultiPart:Yandex翻译API仅接受纯JSON格式的请求体,无需多部分表单提交。
- Authorization头位置错误:认证令牌应设置在
QNetworkRequest对象上,而非QHttpPart中。 - 重复读取响应数据:
rep->readAll()调用两次,第一次已将响应数据流读取完毕,第二次返回空值。
修正后的完整代码
请求发送部分
QUrl url("https://translate.api.cloud.yandex.net/translate/v2/translate"); QNetworkAccessManager *mgr = new QNetworkAccessManager(this); // 使用Qt5+新信号槽语法更安全 connect(mgr, &QNetworkAccessManager::finished, this, &myClass::onFinish); // 构建符合API要求的JSON请求体 QJsonObject metaBody; metaBody.insert("targetLanguageCode", "ru"); metaBody.insert("texts", QJsonArray({"Hello"})); // texts必须是字符串数组 metaBody.insert("folderId", "b1gdeb0pudkrac4ij1hd"); QJsonDocument jsonDoc(metaBody); QByteArray postData = jsonDoc.toJson(); // 配置请求头 QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader("Authorization", "Bearer LjJrImZGOkZzMy4"); // 替换为你的有效令牌 QNetworkReply *ans = mgr->post(request, postData);
响应处理部分
void myClass::onFinish(QNetworkReply *rep) { // 一次性读取所有响应数据 QByteArray responseData = rep->readAll(); qDebug() << "API响应:" << responseData; // 解析JSON响应 QJsonParseError parseError; QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "JSON解析失败:" << parseError.errorString(); rep->deleteLater(); return; } qDebug() << "格式化响应:" << jsonDoc.toJson(QJsonDocument::Indented); // 此处添加你的业务逻辑处理... // 必须释放QNetworkReply对象 rep->deleteLater(); }
关键注意事项
- texts字段格式:Yandex翻译API明确要求
texts参数为字符串数组,直接传入单个字符串会导致请求格式错误,API可能无响应或返回格式错误。 - 资源管理:
QNetworkReply对象必须调用deleteLater()释放,避免内存泄漏。 - 令牌有效性:确保使用的Bearer令牌是有效的,可通过官方提供的Python示例或API测试工具验证。
内容的提问来源于stack exchange,提问作者Roman Khudoberdin
相关产品推荐
相关产品推荐

