Example #1
0
// 执行请求的辅助函数
void HttpClientPrivate::executeQuery(HttpClientPrivate *d, HttpMethod method,
                                     std::function<void (const QString &)> successHandler,
                                     std::function<void (const QString &)> errorHandler,
                                     const char *encoding) {
    // 如果不使用外部的 manager 则创建一个新的,在访问完成后会自动删除掉
    bool debug = d->debug;
    bool internal;
    QNetworkAccessManager *manager = HttpClientPrivate::getManager(d, &internal);
    QNetworkRequest        request = HttpClientPrivate::createRequest(d, method);
    QNetworkReply           *reply = nullptr;

    switch (method) {
    case HttpClientPrivate::GET:
        reply = manager->get(request);
        break;
    case HttpClientPrivate::POST:
        reply = manager->post(request, d->useJson ? d->json.toUtf8() : d->params.toString(QUrl::FullyEncoded).toUtf8());
        break;
    case HttpClientPrivate::PUT:
        reply = manager->put(request, d->useJson ? d->json.toUtf8() : d->params.toString(QUrl::FullyEncoded).toUtf8());
        break;
    case HttpClientPrivate::DELETE:
        reply = manager->deleteResource(request);
        break;
    default:
        break;
    }

    QObject::connect(reply, &QNetworkReply::finished, [=] {
        QString successMessage = HttpClientPrivate::readReply(reply, encoding); // 请求结束时一次性读取所有响应数据
        QString errorMessage   = reply->errorString();
        HttpClientPrivate::handleFinish(debug, successMessage, errorMessage, successHandler, errorHandler,
                                        reply, internal ? manager : nullptr);
    });
}
QJsonObject SeleniumServerHub::exec(QString url, QByteArray rawBody, int method)
{
    m_result = "";
    QJsonObject result;

    QUrl urlObject(m_urlHub + url);
    QNetworkRequest request(urlObject);

    QString contentType = "application/json";

    QNetworkAccessManager* manager = new QNetworkAccessManager(this);

    if(method == GET) {

        m_reply = manager->get(request);

    } else if(method == POST) {

        if(rawBody.isEmpty()) {

            request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
            m_reply = manager->post(request, "");

        } else {

            QByteArray postDataSize = QByteArray::number(rawBody.size());
            request.setRawHeader("Content-Type", contentType.toLatin1());
            request.setRawHeader("Content-Length", postDataSize);

            m_reply = manager->post(request, rawBody);
        }

    } else if(method == DELETE) {

        m_reply = manager->deleteResource(request);

    } else {
        throw (new QueleniumException("Unsupported method", 99));
    }

    connect(m_reply, SIGNAL(readyRead()), SLOT(slotReplyResponse()));
    connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(slotReplyError()));
    connect(m_reply, SIGNAL(finished()), SLOT(slotFinishRequest()));

    //this loop for synchronize requests
    QEventLoop loop;
    connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit()));
    connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(deleteLater()));
    connect(m_reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();

    if(m_result.trimmed().isEmpty()) {
        WebDriverException::throwException("Empty reply from server");
    }

    result = QJsonDocument::fromJson(m_result.toUtf8()).object();

    if(result["status"].toInt() != ResponseStatusCodes::SUCCESS) {

        QString message = result["state"].toString();
        if(result["value"].isObject() && result["value"].toObject()["message"].isString()) {
            message = result["value"].toObject()["message"].toString();
        }

        WebDriverException::throwException(message, result["status"].toInt());
    }

    return result;
}