2016-04-11 6 views
0

マルチパートを使用してポストリクエストを書く際に、私は解決策を見つけることができない小さな質問が出たので、ここで質問します。この関数は、要求が送信された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つの構造を結合する方法を見つけることができません。多分誰かがこの問題に関する知識を共有することができますか?

+0

私は何か愚かで明白ではないかもしれません) –

+0

実際に私はそれを解決する方法を知っています、私はまだ他の意見が欲しいです。テンプレート関数とオーバーロードの2つの方法があります。しかし、私は、私は何か重要なことを見逃しているかもしれないと言った –

+0

私はまだtemlatesを使ってそれを行う方法を考え出していません。私はそれがまだ解決していないことを知っています –

答えて

0

いくつかは、私はテンプレートまたはオーバーロードを使用してこの特定の関数をsimlifyするよりも、私は多くのコードを書き直す必要があることを発見した後、関数が頻繁に使用されます。これに加えて、実際には2番目と3番目の引数のデフォルト値を渡すことができる必要があることが判明したので、この関数を書き直すには本当の意味はありません。

関数の定義は次のようになります。いずれかの任意のアイデアを持っている場合はQByteArray request(const QString &url, OperationType=OperationType::GET_QUERY, QHttpMultiPart* =NULL);

、私はまだ答えに興味があります。

+0

まだ解決されていません。私はまだアイデアを待っています –

0

私は考えている間に、別の解決策を考え出しました。テストする必要があるかどうかはわかりません。本質的にurlencoded paramsはリンク自体の中で渡されるので、理論的には私はすでに作成されたリンクを要求に渡し、 "空の"投稿要求(空のmultipart)を送信することができます。不幸にもそれは偽りの希望であり、うまくいかない。アイデアがありません(

+0

これは安全に閉じたり削除したりできると思います。関数はそのままで、私は推測すると、temlatesは解決策を提供していない、あるいは私は彼らの中にtotall noobであり、テンプレートをどのように作成するのか分からない。 –

関連する問題