Minimal User Interface (C++)
psidk can provide a minimal UI to your services. This UI can help get you started developing your own services, but isn't suitable for end users.
Here is the service definition. Place example.cpp
and CMakeLists.txt
in an empty folder.
example.cpp
#include <psibase/psibase.hpp>
struct ExampleService
{
int32_t add(int32_t a, int32_t b) { return a + b; }
int32_t multiply(int32_t a, int32_t b) { return a * b; }
// This action serves HTTP requests
std::optional<psibase::HttpReply> serveSys(psibase::HttpRequest request)
{
// serveSimpleUI serves UI files to the browser and
// provides an RPC interface for preparing transactions.
return serveSimpleUI<ExampleService, true>(request);
}
};
PSIO_REFLECT(ExampleService, //
method(add, a, b),
method(multiply, a, b),
method(serveSys, request))
PSIBASE_DISPATCH(ExampleService)
CMakeLists.txt
CMakeLists.txt is the same as the one in Basic Service.
Building
This will create example.wasm
:
mkdir build
cd build
cmake `psidk-cmake-args` ..
make -j $(nproc)
Deploying the service
This will deploy the service to the chain:
psibase deploy -ip example example.wasm
The -p
option will register the service with the http-server
service. This allows the service to handle web requests. See the registerServer
docs for more details.
Trying the service
If you're running a test chain locally, then it will typically be at http://psibase.127.0.0.1.sslip.io:8080/
or http://psibase.127.0.0.1.sslip.io:8079/
. To try the service, prefix your host with your service name (e.g. http://example.psibase.127.0.0.1.sslip.io:8080/
).
How it works
- psinode forwards most http requests to the
http-server
service. - If the URL begins with
/common
,http-server
forwards the request to thecommon-api
service.common-api
provides shared resources, such as js library code and an RPC request handler for packing transactions. http-server
looks at the request domain. If it begins with the name of a registered service, it calls that service'sserveSys
action to process the request.- psibase::serveSimpleUI handles the following requests:
GET /
returns a minimal html file which references the/common/SimpleUI.mjs
script. This script generates the UI dynamically.GET /action_templates
returns a template json structure (below). This lets the UI know which actions are available and sample values for their arguments. This isn't a schema; it's only suitable for simple cases.POST /pack_action/add
accepts the arguments for theadd
action as a JSON object, converts it to binary, and returns the result.
For more detail, see Web Services.
/action_templates
result
{
"add": {
"a": 0,
"b": 0
},
"multiply": {
"a": 0,
"b": 0
},
"serveSys": { ... }
}