Qt从SoapRequest获得响应

时间:2010-10-24 13:17:38

标签: c++ web-services qt soap

使用QtSoap lib在Qt中考虑以下内容:

 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 :(得分:-1)

我没有看到问题。 QtSoapHttpTransport reference已经有了一个很好的简单示例。

如果你想要一个只在收到响应时阻止并返回的getter,那么进行主动等待(你的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文档中一样。