QT-запрос на SaleForse с кодом состояния 0

#qt #http #post #salesforce #http-post

#qt #http #Публикация #salesforce #http-post

Вопрос:

У меня есть отдельное приложение, которое имеет функцию с 2 функциями post-запроса: сначала для получения токена от salesforse, во-вторых, для отправки моих данных json, когда я запускаю приложение на своем компьютере, его запрос на отправку работает нормально, но на других компьютерах код состояния из post-запроса равен 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;
    }

}
  

Комментарии:

1. Есть ли причина, по которой вы используете while (!reply->isFinished()) вместо подключения к finished сигналу?

2. какой URL-адрес во втором вызове? Предполагается, что вы должны прочитать токен доступа и URL-адрес экземпляра из ответа на вход (см. help.salesforce.com /… ), а затем используйте это в качестве базовой линии для всех последующих вызовов. Создайте что-то вроде {instance_url}/services/data/v49.0/sobjects/Account , а затем ОПУБЛИКУЙТЕ JSON учетной записи, которую вы хотите создать.

3. @eyescream Да, второй запрос post отправляется с другим URL-адресом, и он работает на моем компьютере (все данные, полученные в SalesForce), но на другом компьютере я получаю этот код ответа 0

4. @JarMan Я использую while (!reply->isFinished()), потому что 2 метода post-запроса в одном соединителе класса и метод SendPost в MainWindow, поэтому я не могу подключиться к reply->isFinished() от FirstPostRequest ко второму

5. Ваш ответ не имеет смысла. Почему так важно, что вы делаете 2 post-запроса в одном классе? Вы все равно можете использовать connect() .

Ответ №1:

Спасибо всем, я использую Qt MessageHandler для записи файла журнала, и произошла ошибка инициализации TLS, поэтому проблема решена с установкой OpenSSL 1.1.1h и Microsoft Visual C 2010 SP1, распространяемый.

Комментарии:

1. Я рад, что вы решили эту проблему, но как удалось выполнить первый вызов (вход в систему) через https, но не второй? Сумасшедший.

2. @eyescream На самом деле, при первой попытке я создал ярлык отладки, в котором я установил только код состояния, только из второго запроса, поэтому это меня смутило, а позже, когда я записываю журнал, я увидел, что они оба завершились неудачей.

3. Понял 🙂 Спасибо, что вернулся ко мне, это будет беспокоить меня по ночам 🙂

Ответ №2:

Однажды я столкнулся с проблемой с кодом состояния 0, и это было связано с истечением времени ожидания запроса. Если вы получаете код состояния 0, попробуйте увеличить время ожидания вашего запроса.