【问题标题】:QT Request to SaleForse with status code 0对 SaleForse 的 QT 请求,状态码为 0
【发布时间】:2020-10-20 19:03:04
【问题描述】:

我有一个独立的应用程序,它有一个具有 2 个发布请求功能的功能,首先是从 salesforse 获取令牌,其次是发送我的 json 数据,当我在我的计算机上执行应用程序时,它的发送请求很好,但在其他计算机上的状态发布请求中的代码为 0。没有代码描述,什么都没有。 为什么它会这样,以及如何理解问题所在(如错误描述)。

第一个:

void Connector::SendFirstPostRequest()
    {
            //QNetworkAccessManager *NetManager = new QNetworkAccessManager(this);
            QNetworkAccessManager NetManager;
            QUrlQuery postData;
            QObject Connector;
            QString FURL = "https://login.salesforce.com/services/oauth2/token";
            QUrl URLNeeded(FURL);
QNetworkRequest request(URLNeeded);
        request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));

        QNetworkReply *reply = NetManager.post(request, postD.toString(QUrl::FullyEncoded).toUtf8());
while (!reply->isFinished())
        {
            qApp->processEvents();

        }
        FirstPostFinished = reply->isFinished();

        QByteArray ResponceData = reply->readAll();
        QJsonDocument rDoc = QJsonDocument::fromJson(ResponceData);
        QJsonObject rJObject = rDoc.object();
        QJsonValue AccessToke = rJObject.value("access_token");
        AcessToken = AccessToke.toString();
        FirstPostCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

        qDebug() << "STATUS: "<< FirstPostCode;
//        qDebug() << reply->header();
        qDebug() << "POST REQUEST SENT";

        reply->deleteLater();
}

第二:

void Connector::SendSecondPostRequest()
{
        QNetworkAccessManager NetManager;
        QUrlQuery postData;
        QObject Connector;
        QUrl URLNeeded(URL);
        

        QJsonObject json;
        QJsonDocument doc(json);
       
        QNetworkRequest request(URLNeeded);
        request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
        auto header = QString("Bearer %1").arg(AcessToken);
        request.setRawHeader(QByteArray("Authorization"), header.toUtf8());

        QNetworkReply *reply = NetManager.post(request, doc.toJson());
        qDebug()<<doc;

        while (!reply->isFinished())
        {
            qApp->processEvents();

        }

        QByteArray ResponceData = reply->readAll();
        QJsonDocument jDoc = QJsonDocument::fromJson(ResponceData);
        qDebug() << jDoc;
        DebugLine = QString(jDoc.toJson(QJsonDocument::Compact));

        SecPostCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

        qDebug() << "STATUS: "<<SecPostCode;
        qDebug() << "POST REQUEST SENT";

        reply->deleteLater();
}

以及操作这两个请求的函数

void MainWindow::SendPost()
{
    if(Conn->SecondsToRequest == 10)
    {
       Conn->SendFirstPostRequest();
       
       while(!Conn->FirstPostFinished)
       {
          qDebug()<<"First post not finished yet";
       }
       Conn->SendSecondPostRequest();
       Conn->SecondsToRequest = 0;
    }

}

【问题讨论】:

  • 你使用while (!reply-&gt;isFinished())而不是连接到finished信号有什么原因吗?
  • 第二次调用的 URL 是什么?您应该从登录响应中读取访问令牌和实例 url(请参阅help.salesforce.com/…),然后将其用作所有后续调用的基线。构造类似{instance_url}/services/data/v49.0/sobjects/Account 的东西,然后发布您要创建的帐户的 JSON。
  • @eyescream 是的,第二个帖子请求与其他 url 一起发布,并且它在我的 PC 上工作(在 SalesForce 上收到的所有数据)但在其他 PC 上我得到这个 0 响应代码
  • @JarMan 我正在使用 while (!reply->isFinished()) 因为一个类连接器中有 2 个发布请求方法,而 MainWindow 中有 SendPost 方法,所以我无法连接到 reply->isFinished() FirstPostRequest 到 Second
  • 你的回答没有意义。为什么在一个班级中发出 2 个帖子请求很重要?你仍然可以使用 connect()。

标签: qt http post salesforce http-post


【解决方案1】:

谢谢大家,我使用 Qt MessageHandler 编写日志文件,TLS 初始化失败,所以问题通过安装 OpenSSL 1.1.1h 和 Microsoft Visual C++ 2010 SP1 Redistributable 解决。

【讨论】:

  • 我很高兴你解决了它,但它是如何设法通过 https 而不是第二次调用(登录)的?疯了。
  • @eyescream 实际上,起初我尝试制作调试标签,我只设置状态代码,仅来自第二个请求,所以它让我感到困惑,后来当我写日志时,我看到它们都失败了。
  • 知道了 :) 谢谢你回来找我,晚上会打扰我的 :)
【解决方案2】:

我曾经遇到过状态码 0 的问题,这是由于请求超时。 如果您收到状态码 0,请尝试增加请求的超时时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2016-05-11
    • 2017-09-25
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多