Qt Получение ответа от SoapRequest - PullRequest
2 голосов
/ 24 октября 2010

Рассмотрим следующее в Qt, используя QtSoap lib:

 QtSoapHttpTransport http;
 http.setHost("XXXX",3333);
 connect(&http, SIGNAL(responseReady()), this, SLOT(getResponse()));

теперь есть метод, который я хочу вызвать:

QtSoapMessage request;
request.setMethod("test");
request.addMethodArgument("xxx","zzzz",xxx);
request.addMethodArgument("xx","xx",xx);
http.submitRequest(Request, "/api/soap");

теперь я хочу иметь что-то вроде этого:

QString GetTest(){
while(http.isBusy);   // no such a thing as isbusy 
return http.getResponse().returnValue().toString();}

или любой другой метод, который я могу использовать, чтобы получить возвращаемое значение или дождаться его и получить ..

Заранее спасибо ...

1 Ответ

0 голосов
/ 25 января 2013

Я не вижу проблемы.QtSoapHttpTransport ссылка уже имеет хороший простой пример.

Если вы хотите получить метод получения, блокирующий и возвращающий только при получении ответа, выполняйте активное ожидание (ваш цикл while)это абсолютно не тот путь.

Вы уже подключили сигнал responseReady к своему слоту, поэтому единственное, чего не хватает, это иметь точку синхронизации, которая блокирует ваш поток, вызывающий getTest, пока этот слот не будетВыполнено.

class Messenger : public QObject {
    Q_OBJECT
public:
    Messenger() { /* ... your initialization code with connect ... */ }

    void sendRequest() { /* ... your sending code ... */ }

    QString getTest()  // call this from a worker thread to wait
    {                  // for a response to arrive and retrieve it
        QMutexLocker lock(&responseMutex);
        responseReady.wait(&responseMutex);
        return http.getResponse().returnValue().toString();
    }

public slots:
    void getResponse() {  // slot called by Qt event loop when response arrives
        responseReady.wakeAll();
    }

private:
    QtSoapHttpTransport http;
    QWaitCondition responseReady;
    QMutex responseMutex;
};

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

Вс другой стороны, если ваше приложение просто хочет сделать что-то с полученным ответом, нет никаких причин, по которым вам в первую очередь нужен метод блокировки.Просто выполняйте свои действия непосредственно в слоте - как в документации по Qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...