Home

Using SOAP with the Google API

This example shows how to use the SOAP component to submit searches via the Google SOAP API.

Testing this example requires a valid license key, which is available for free from http://api.google.com/.


examples/google/google.h:

#ifndef GOOGLE_H_INCLUDED
#define GOOGLE_H_INCLUDED
#include <qwidget.h>
#include <qtsoap.h>

class QLineEdit;
class QTextBrowser;
class QPushButton;

class Google : public QWidget
{
    Q_OBJECT
public:
    Google(QWidget *parent = 0, const char *name = 0);

private slots:
    void submitRequest();
    void getResponse();

private:
    QtSoapHttpTransport http;

    QLineEdit *searchString;
    QLineEdit *googleKey;
    QTextBrowser *resultView;
    QPushButton *quitButton;
    QPushButton *searchButton;
    QString key;
};

#endif


examples/google/google.cpp:

#include <qapplication.h>
#include <qmessagebox.h>
#include <qcursor.h>
#include <qfile.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qtextbrowser.h>
#include <qlayout.h>
#include <qpushbutton.h>
#include "google.h"

Google::Google(QWidget *parent, const char *name)
    : QWidget(parent, name), http(this, "Google::http")
{
    // Generate the GUI.
    quitButton = new QPushButton("&Quit", this);
    searchString = new QLineEdit(this);
    resultView = new QTextBrowser(this);
    resultView->setTextFormat(RichText);
    QVBoxLayout *layout = new QVBoxLayout(this);

    QLabel *gLabel = new QLabel("Google Web APIs license key: ", this);
    googleKey = new QLineEdit(this);
    QHBoxLayout *topBar = new QHBoxLayout(layout);
    topBar->addWidget(gLabel);
    topBar->addWidget(googleKey);

    QLabel *sLabel = new QLabel("Search string: ", this);
    QPushButton *searchButton = new QPushButton("Search!", this);
    QHBoxLayout *searchBar = new QHBoxLayout(layout);
    searchBar->addWidget(sLabel);
    searchBar->addWidget(searchString);
    searchBar->addWidget(searchButton);

    layout->addWidget(resultView);
    layout->addWidget(quitButton);

    // Connect signals to slots. Note the submitRequest() slots.
    connect(&http, SIGNAL(responseReady()), SLOT(getResponse()));
    connect(quitButton, SIGNAL(clicked()), SLOT(close()));
    connect(searchString, SIGNAL(returnPressed()), SLOT(submitRequest()));
    connect(searchButton, SIGNAL(clicked()), SLOT(submitRequest()));
    connect(googleKey, SIGNAL(returnPressed()), SLOT(submitRequest()));

    // Pressing enter should trigger a search, unless focus has been
    // explicitly moved.
    searchButton->setDefault(true);

    // Prepare to submit request.
    http.setAction("urn:GoogleSearchAction");
    http.setHost("api.google.com");
}

void Google::submitRequest()
{
    // Check that the license key is set.
    if (googleKey->text() == "") {
        QMessageBox::warning(this, tr("Missing license key"),
                             tr("Please enter your Google Web APIs license key."
                                " If you do not have one, you can visit<br>"
                                " http://api.google.com/ and create a Google"
                                " account to obtain a license key."));
        return;
    }

    // Check that we have a search string.
    if (searchString->text() == "") {
        QMessageBox::warning(this, tr("Missing search string"),
                             tr("Please enter a search string."));
        return;

    }

    // Generate request. Details about how to generate a proper
    // request are available from http://api.google.com/. The results
    // are always fetched as latin1 in this example, but this can be
    // easily changed (see the "ie" and "oe" arguments below).
    QtSoapMessage request;
    request.setMethod(QtSoapQName("doGoogleSearch", "urn:GoogleSearch"));
    request.addMethodArgument("key", "", googleKey->text());
    request.addMethodArgument("q", "", searchString->text());
    request.addMethodArgument("start", "", 0);
    request.addMethodArgument("maxResults", "", 10);
    request.addMethodArgument("filter", "", false, 0);
    request.addMethodArgument("restrict", "", "");
    request.addMethodArgument("safeSearch", "", false, 0);
    request.addMethodArgument("lr", "", "");
    request.addMethodArgument("ie", "", "latin1");
    request.addMethodArgument("oe", "", "latin1");

    // Submit the method request to the web service.
    http.submitRequest(request, "/search/beta2");

    // Set the cursor to wait mode.
    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
}

void Google::getResponse()
{
    // Set cursor back to normal shape.
    QApplication::restoreOverrideCursor();

    // Reset resultView.
    resultView->clear();
    resultView->setContentsPos(0, 0);

    // Get the response, check for error.
    const QtSoapMessage &resp = http.getResponse();
    if (resp.isFault()) {
        resultView->setText(tr("<b>Query failed</b>: ")
                            + resp.faultString().value().toString());
        return;
    }

    // Extract the return value from this method response, check for
    // errors.
    const QtSoapType &res = resp.returnValue();
    if (!res.isValid()) {
        resultView->append(tr("Invalid return value"));
        return;
    }

    // Generate resultView output. Make it resemble the actual web
    // output from http://www.google.com/.
    QString header;
    header.sprintf(tr("Searched the web for <b>%s</b>, results %i - %i "
                      "of about %i. Search took %.2f seconds.<br><hr>"),
                   res["searchQuery"].toString().latin1(),
                   res["startIndex"].toInt(),
                   res["endIndex"].toInt(),
                   res["estimatedTotalResultsCount"].toInt(),
                   res["searchTime"].value().toDouble());

    const QtSoapType &resultElements = res["resultElements"];
    QString allElements;

    for (int i = 0; i < resultElements.count(); ++i) {
        const QtSoapType &resultElement = res["resultElements"][i];

        QString cat = resultElement["directoryCategory"]["fullViewableName"].toString();
        QString summary = resultElement["summary"].toString();
        QString title = resultElement["title"].toString();
        QString snippet = resultElement["snippet"].toString();
        QString url = resultElement["URL"].toString();
        QString cachedSize = resultElement["cachedSize"].toString();

        QString thisElement = "<br>";

        if (!title.isEmpty()) {
            thisElement += "<font color=\"#0000FF\"><b><u>"
                           + title + "</u></b></font><br>";
        } else {
            thisElement += "<font color=\"#0000FF\"><b><u>"
                           + url + "</u></b></font><br>";
        }

        if (!snippet.isEmpty())
            thisElement += snippet + "<br>";

        if (!summary.isEmpty()) {
            thisElement += "<font color=\"#808080\">Description:</font> "
                           + summary + "<br>";
        }

        if (!cat.isEmpty()) {
            thisElement += "<font color=\"#808080\">Category: <u>"
                           + cat + "</u></font><br>";
        }

        if (!title.isEmpty()) {
            thisElement += "<font color=\"#008000\"><u>" + url
                           + "</u> - " + cachedSize + "</font><br>";
        }

        allElements += thisElement;
    }

    // Update the resultView.
    resultView->setText(header + allElements);
}


examples/google/main.cpp:

#include <qapplication.h>
#include "google.h"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    Google google;

    app.setMainWidget(&google);
    google.show();

    return app.exec();
}


examples/google/google.pro:

TEMPLATE = app
INCLUDEPATH += .
CONFIG += debug

include(../../src/qtsoap.pri)

# Input
HEADERS += google.h
SOURCES += google.cpp main.cpp


Copyright © 2003-2004 TrolltechTrademarks
Qt Solutions