Magic 8 Ball

Création d'une connexion HTTP2 entre un client Qt gRPC™ et un serveur « gRPC » en C++.

Magic 8 Ball envoie une question à un serveur et affiche la réponse reçue :

Capture d'écran illustrant la « Magic 8 Ball »

Le code d'exemple comprend les composants suivants :

  • magic8ball Une application client Qt gRPC qui utilise les fonctions CMake qt_add_protobuf() et qt_add_grpc() pour la génération de code Qt des messages et des services.
  • server Une application qui appelle le plugin C++ d'gRPC pour générer le code serveur et implémenter une logique serveur simple.

Remarque : le plugin C++ gRPC doit être installé. Pour plus de détails, consultez la section « Prérequis des modules ».

Les deux composants utilisent des messages générés à partir du schéma protobuf décrit dans le fichier exampleservice.proto:

syntax = "proto3";

package qtgrpc.examples;

message AnswerRequest {
    string question = 1;
}

message AnswerResponse {
    string message = 1;
}

service ExampleService {
    rpc answerMethod(AnswerRequest) returns (AnswerResponse) {}
}

Le client gRPC est défini comme un objet QML disponible une fois le code compilé.

    ExampleServiceClient {
        id: grpcClient
        channel: grpcChannel.channel
    }

Le service client se connecte à l’ localhost via le port 50051, qui est spécifié dans les options du canal gRPC:

    GrpcHttp2Channel {
        id: grpcChannel
        hostUri: "http://localhost:50051"
        // Optionally, you can specify custom channel options here
        // options: GrpcChannelOptions {}
    }

Et envoie une requête à la partie serveur :

    function requestAnswer(question: string): void {
        ...
        root.answerReq.question = question;
        grpcClient.answerMethod(root.answerReq, finishCallback, errorCallback, grpcCallOptions);
    }

answerMethod est une méthode de l’ gRPC que le client appelle. Elle comporte quatre paramètres : l’objet de requête, une fonction de rappel de fin, une fonction de rappel d’erreur et un objet GrpcCallOptions.

Cliquez sur le bouton « Ask » pour envoyer la requête au serveur magic8ball.

Remarque : vous devez exécuter le serveur en parallèle de l’application cliente.

L'application « server » choisit une réponse aléatoire dans la liste des réponses et envoie les données au port du client. Elle vérifie également que la requête contient un champ « question » non vide. Si le champ est vide, elle renvoie un StatusCode::INVALID_ARGUMENT

    grpc::Status answerMethod(grpc::ServerContext *, const AnswerRequest *request,
                              AnswerResponse *response) override
    {
        if (request->question().empty()) {
            std::cerr << "Question is empty" << std::endl;
            return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "Question is empty");
        }
        std::cout << "Received question: " << request->question() << std::endl;

        response->set_message(getRandomAnswer());

        return grpc::Status();
    };

Après avoir reçu une réponse, l’application cliente affiche la réponse.

Exemple de projet sur code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.