Running a REST service for generating points#
The Creating a Scan Spec tutorial shows how you would use the commandline client to
plot a Spec
. This maps nicely to using scanspec in a commandline utility, but
not if you want to expose those points to a web GUI. To do this we will bring up
a RESTful service, compatible with OpenAPI, that allows a web GUI to request the
points it would like to plot.
Running the server#
In a terminal, run:
$ scanspec service --cors
======== Running on http://localhost:8080 ========
(Press CTRL+C to quit)
You can now open a browser to http://localhost:8080/docs and see a Swagger UI editor
which will allow you to send requests to the server using, for example, the curl
command.
See also
Validating a Spec#
You can ensure a spec is valid by passing it to the /valid
endpoint.
curl -X 'POST' \
'http://localhost:8080/valid' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"outer": {
"axis": "y",
"start": 0,
"stop": 10,
"num": 3,
"type": "Line"
},
"inner": {
"axis": "x",
"start": 0,
"stop": 10,
"type": "Line"
},
"type": "Product"
}'
Should return a 422 error code because the inner axis is missing a parameter.
Generating Midpoints#
There are several endpoints to inspect generated points. The most useful is /midpoints
,
which gives the middle coordinate of each scan point, organised by axis name.
curl -X 'POST' \
'http://localhost:8080/midpoints' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"spec": {
"outer": {
"axis": "y",
"start": 0,
"stop": 10,
"num": 3,
"type": "Line"
},
"inner": {
"axis": "x",
"start": 0,
"stop": 10,
"num": 4,
"type": "Line"
},
"type": "Product"
},
"max_frames": 1024,
"format": "FLOAT_LIST"
}'
Should output:
{"format": "FLOAT_LIST",
"midpoints": {"x": [0.0,
3.333333333333333,
6.666666666666667,
10.000000000000002,
0.0,
3.333333333333333,
6.666666666666667,
10.000000000000002,
0.0,
3.333333333333333,
6.666666666666667,
10.000000000000002],
"y": [0.0,
0.0,
0.0,
0.0,
5.0,
5.0,
5.0,
5.0,
10.0,
10.0,
10.0,
10.0]},
"returned_frames": 1024,
"total_frames": 12}