Как правильно составить post запрос к yandex translete api через QNetworkAccessManager?
Решил попробовать Яндекс переводчик в своем проекте. Проблема в том, нет примеров работы с api на с++ или qt. По этому решил сам разобраться при помощи QNetworkAccessManager, просидев весь день, понял, что пора идти сюда
QUrl url = QUrl("https://translate.api.cloud.yandex.net/translate/v2/translate");
QNetworkAccessManager * mgr = new QNetworkAccessManager(this);
connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(onFinish(QNetworkReply*)));
QHttpMultiPart * http = new QHttpMultiPart(this);
QHttpPart receiptPart;
QJsonObject metaBody;
metaBody.insert("targetLanguageCode", "ru");
metaBody.insert("texts", "Hello");
metaBody.insert("folderId", "b1gdeb0pudkrac4ij1hd");
receiptPart.setRawHeader("Content-Type", "application/json");
receiptPart.setRawHeader("Authorization", "Bearer LjJrImZGOkZzMy4"); // ключ изменен
receiptPart.setBody(QJsonDocument(metaBody).toJson());
http->append(receiptPart);
QNetworkReply * ans = mgr->post(QNetworkRequest(url), http);
В метод onFinish я попадаю, но вот данных в rep нет, даже об ошибке.
void MainWindow::onFinish(QNetworkReply *rep)
{
QJsonParseError parseError;
QJsonDocument jsonDoc;
jsonDoc = QJsonDocument::fromJson( rep->readAll(), &parseError );
QString str = rep->readAll();
qDebug() << str;
}
Ключ хоть и не верный, но api выдает ответ:
{
"code": 16,
"message": "Token signature mismatch, Key id: ajef3df54ebijh16f737",
"details": [
{
"@type": "type.googleapis.com/google.rpc.RequestInfo",
"requestId": "c2bccede-0ba7-408e-bcdc-a13facf5c978"
}
]
}
Мой аккаунт / ключ находиться в рабочем состоянии, проверял при помощи примера на Python
Ответы (1 шт):
Думается что QHttpMultiPart не совсем то что вам нужно.
Начиная с того что получится запрос MIME из нескольких частей разделенных boundary (сомневаюсь что на стороне сервера он будет разбираться). Вдобавок вы вставляете jwt токен в заголовок одной из mime частей, а не в заголовок запроса.
Вам надо делать обычный запрос. Примерно так
QNetworkAccessManager * manager = new QNetworkAccessManager(this);
connect( manager, SIGNAL( sslErrors(QNetworkReply*,QList<QSslError>)) , SLOT( sslErrors(QNetworkReply*,QList<QSslError>))) ;
connect( manager, SIGNAL( finished( QNetworkReply* ) ), SLOT( onFinished( QNetworkReply* ) ) );
QNetworkRequest req;
QUrl r(url);
req.setUrl(r); req.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
req.setRawHeader("Authorization", QString("Bearer %1").arg(token));
req.setRawHeader("Accept","application/json");
QNetworkReply* rep = manager->post(req,"{'sourceLanguageCode':'ru','targetLanguageCode':'en','texts':['gроверка API'],'folderId':'b1gdeb0pudkrac4ij1hd'}");
connect(rep,SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(uploadProgress(qint64,qint64)));
connect(upload,SIGNAL(cancel()),rep,SIGNAL(abort()));