マルチパートを使用してポストリクエストを書く際に、私は解決策を見つけることができない小さな質問が出たので、ここで質問します。この関数は、要求が送信されたURL、なされなければならない要求(GETまたはPOST)の種類を受け付け、任意のparam QHttpmultipartとしてコードQNetworkAccessManager + multipart + url encoded
QByteArray moodleTester::request(const QString &url, OperationType opType, QHttpMultiPart* multiPart) {
QNetworkRequest req{QUrl(url)};
if(!multiPart) {
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
}
// Пробуем послать запрос. Если всё прошло гладко, то возвращаем данные в середине цикла.
for(int errCount = 0; errCount < maxErrors; ++errCount) {
unique_ptr<QNetworkReply> reply;
switch(opType) {
case OperationType::GET_QUERY:
reply.reset(manager->get(req));
break;
case OperationType::POST_QUERY:
if(!multiPart) {
reply.reset(manager->post(req, params.toString(QUrl::FullyEncoded).toUtf8()));
}
else {
reply.reset(manager->post(req, multiPart));
}
break;
}
QObject::connect(reply.get(), SIGNAL(sslErrors(QList<QSslError>)), reply.get(), SLOT(ignoreSslErrors()));
waitForReply(reply.get());
if(reply->error() == QNetworkReply::NoError) {
QUrl redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
if(redirect.isValid() && reply->url() != redirect) {
if(redirect.isRelative()) {
redirect = reply->url().resolved(redirect);
}
currUrl = redirect.toString();
params.clear();
return request(currUrl);
}
QByteArray data = reply->readAll();
if(isValid((data))) {
return data;
}
else{
++errCount;
QTest::qSleep(1000);
continue;
}
}
// Произошла ошибка. Сообщаем в лог и перезапрашиваем данные.
++errCount;
QString msg = mdlTime() + "ErrorNo: " + QString::number(reply->error()) + " for url: " + reply->url().toString();
qout << msg << endl;
log() << msg << endl;
msg = mdlTime() + "Request failed: " + reply->errorString();
qout << msg << endl;
log() << msg << endl;
QTest::qSleep(1000);
}
// Кол-во ошибок превысило максимально допустимое.
params.clear();
exit(-10);
}
の次の部分を考えます。マルチパートは別の関数で作成されます。 mutlipartが渡されない場合、デフォルトでx-www-form-urlencoded
が送信されます。 urlencodedのparams(QUrlQueryクラス)は、クラスのプライベートメンバーとして保持されます。 P.S、関数は同じクラスのメンバーです。このコードはうまく動作しますが、私の苦境はこれです - 私はそれを改善しようとしており、urlencoded paramsとmultipart paramsをユニット化する方法を見つけようとしています。これまでのところ、私は両方がQioDeviceから派生していることを知っています。私は、パラメータを渡す方法としてQioDeviceを使用する考えがありますが、mutlipartとurlencodedは異なる構造を持っています。今のところ、これらの2つの構造を結合する方法を見つけることができません。多分誰かがこの問題に関する知識を共有することができますか?
私は何か愚かで明白ではないかもしれません) –
実際に私はそれを解決する方法を知っています、私はまだ他の意見が欲しいです。テンプレート関数とオーバーロードの2つの方法があります。しかし、私は、私は何か重要なことを見逃しているかもしれないと言った –
私はまだtemlatesを使ってそれを行う方法を考え出していません。私はそれがまだ解決していないことを知っています –