QNetworkAccessManager で 同期通信

Qt で HTTP リクエストを行う際には QNetworkAccessManager (通称nam) を利用しますが、基本的には非同期の動作となり、QNetworkReply::finished シグナルを利用して終了時の処理を行います。

ただし、特殊な場合(コマンドラインアプリケーションを作っているとか)には、同期で通信してくれた方がありがたいことがあります。

この場合、ドキュメントには記載がない非公式な方法として QNetworkRequestSynchronousRequestAttribute アトリビューションを有効にすることで実現が可能です。

static QNetworkAccessManager nam;
QNetworkRequest request(QUrl(QStringLiteral("https://www.google.com/recaptcha/api/siteverify")));
request.setAttribute(QNetworkRequest::SynchronousRequestAttribute, true);
QUrlQuery query;
query.addQueryItem(QStringLiteral("secret"), secret);
query.addQueryItem(QStringLiteral("response"), response);
auto reply = nam.post(request, query.toString().toUtf8());

auto data = reply->readAll();
reply->deleteLater();

基本的には必要のない技術ですが、何かの時に思い出してください!