[Development] Feedback on Qt RESTful client development

drwho drwho at infidigm.net
Fri May 12 14:48:33 CEST 2023

FoxMQ is a layer 7 protocol supporting publish / subscribe, query / 
response and broadcast messaging.  It is currently being implemented 
from a specifcation <https://gitlab.com/craftsmanshipsoftware/foxmq>.

  * messages are made of a header, topic and content.
  * clients can _subscribe_ to a published topic or do a one time fetch.
  * the server manages the subscriptions.  When a publish happens, the
    server determines which clients should receive the topic based on
    who has subscribed to it.
  * clients can send a _change request_ to the server for a specific
    topic.  The client sends new content in the change request.  The
    server then publishes the new content from the client.
  * the server can publish topics independent of client change requests.
  * published topics contain the id of the client that made the change
    request in the message header.  If the server originated the publish
    without a change request, the server's id is used in the header. 
    The purpose of this is to know who made the change request.
  * The header contains a publish count.  Each time the server publishes
    a topic, the publish count increases by one.
  * change requests are sent with the latest publish count for that
    topic.  If two or more clients send change requests for the same
    topic at the same time, the server can choose use the first change
    request it gets with the up-to-date publish count, and then publish
    and increment the publish count.  The server can choose to throw
    away the remaining change requests with the old publish count.  The
    purpose of this is so that server can differentiate between old and
    new change requests using the value of the publish count.
  * clients can also _query_ a topic from the server and the server then
    only responds to that one client with the response. (like http get) 
    This is separate from publish / subscribe functions.
  * FoxMQ specifies two libraries for Qt apps, a client and a server
  * FoxMQ uses both QSslSockets and QWebSockets in the server. The Qt
    client library only has QSslSockets specified.  Webpages /
    javascript can connect to the QWebSockets.
  * the server can operate either or both of the QSslSocket listener and
    QWebSocket listener on ports of its choosing.
  * server and client authentication can be done using QSslSocket's api
  * supports user access control.  Clients are granted _permitted
    topics_ as they connect or authenticate.  Permitted topics can be
    updated throughout the connection.  (more topics can be permitted
    after authentication for example).  Granting a topic = "user" also
    allows that client to use topics = "user.add", "user.remove",
    "user.ro.list" (user.*).  Granting a topic = "user.ro" would only
    allow that client to access "user.ro.list" (user.ro.*)
  * in a similar way to the UAC, a client can subscribe to a family of
    topics.  Subscribing to "user" also will enable receiving topics on
    "user.added", "user.removed", "user.ro.list".  This behavior is like
    doing ls user*  .  One could also subscribe to user.r and then just
    receive "user.removed", "user.ro.list"


On 2023-05-12 04:04, Juha Vuolle wrote:
> Hi,
> I'm collecting thoughts on how to make developing Qt REST /client/
> applications a smoother experience.
> Here I'm thinking about a "typical" client application that wants to
> talk with "typical" REST servers
> as they exist today. As it stands today, the main options are
> XMLHttpRequest on QML side and QtNetwork
> classes on the C++ side (with per-application QML binding option).
> REST  is a large and ~loosely defined umbrella and I'd appreciate your
> thoughts - what would actually /help/?
> In particular I'm interested in hearing about:
> 1) Current use cases and the bottlenecks/painpoints with them
> 2) Specifically about the seen utility of introducing a fetch() API,
> see below  *)
> 3) Specifically about the seen utility for OpenAPI code-generation
> (below), see below *)
> If any thoughts, leave a comment here or here:
> https://bugreports.qt.io/browse/QTBUG-112276
> Thank you
> Juha
> *) Few of the more promising directions I've looked into are:
> 1) Adding fetch() support in QML. Fetch is a Promise based Javascript
> API (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
>     The reason I've picked it up is that it's a widely known JS API
> which makes for quite compact and readable code.
>     But - would you find this useful?
>     To give an idea, fetching a JSON:
>     fetch("urlhere")
>           .then((response) => response.json())
>           .then((json) => myModel.model = json)
>           .catch((error) => console.log("Oh no", error)
> 2) Providing support for OpenAPI code generation tools;  with OpenAPI
> you can generate Qt client networking boilerplate code based on an API
> description (https://openapi-generator.tech/)
>      This would probably build on top of the existing cpp-qt-client
> generator and add things like out-of-the-box QML support and build
> system integration.
>      The concept is well-known and sound, but do you see use for this?
> 3) Improving Qt OAuth2 supporthttps://bugreports.qt.io/browse/QTBUG-113218
> 4) Possibly: Convenience classes for dealing with tasks around offline
> operation, caching, and also possibly convenience data models.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20230512/71c57794/attachment.htm>

More information about the Development mailing list