Since version 4.5, PyWPS includes an experimental implementation of the novel OGC API. This standard defines the OGC API - Processes API standard. This standard builds on the OGC Web Processing Service (WPS) 2.0 Standard and defines the processing interface to communicate over a RESTful protocol using JSON encodings.
For more details about the standard please refer to https://github.com/opengeospatial/ogcapi-processes
WPS 1.0 standard defines input and outputs in XML format. OGC API - Processes: rest-api, json. PyWPS >= 4.5 allows inputs and outputs to be in both XML and JSON formats.
The default format (mimetype) of the input/output is determinate by the URL:
- Default XML - if the url starts with /wps
- Default JSON - if the url starts with /jobs or /processes
Please refer to app.basic.parse_http_url for full details about those defaults.
The default mimetype (output format) can be set by adding &f=json or &f=xml parameter.
GET GetCapabilities Request URL:
http://localhost:5000/processes/?service=WPS
http://localhost:5000/wps/?request=GetCapabilities&service=WPS&f=json
GET GetCapabilities Response:
{
"pywps_version": "4.5.0",
"version": "1.0.0",
"title": "PyWPS WPS server",
"abstract": "PyWPS WPS server server.",
"keywords": [
"WPS",
"PyWPS",
],
"provider": {
"name": "PyWPS Development team",
"site": "https://github.com/geopython/pywps-flask",
},
"serviceurl": "http://localhost:5000/wps",
"languages": [
"en-US"
],
"language": "en-US",
"processes": [
{
"class": "processes.sayhello:SayHello",
"uuid": "None",
"workdir": null,
"version": "1.3.3.8",
"identifier": "say_hello",
"title": "Process Say Hello",
"abstract": "Returns a literal string output with Hello plus the inputed name",
"keywords": [],
"metadata": [],
"inputs": [
{
"identifier": "name",
"title": "Input name",
"abstract": "",
"keywords": [],
"metadata": [],
"type": "literal",
"data_type": "string",
"workdir": null,
"allowed_values": [],
"any_value": false,
"mode": 1,
"min_occurs": 1,
"max_occurs": 1,
"translations": null,
"data": "World"
}
],
"outputs": [
{
"identifier": "output",
"title": "Output response",
"abstract": "",
"keywords": [],
"data": null,
"data_type": "string",
"type": "literal",
"uoms": [],
"translations": null
}
],
"store_supported": "true",
"status_supported": "true",
"profile": [],
"translations": null
}
]
}
GET DescribeProcess Request URL:
http://localhost:5000/processes/say_hello?service=WPS
http://localhost:5000/wps/?request=DescribeProcess&service=WPS&identifier=say_hello&version=1.0.0&f=json
GET DescribeProcess Response:
{
"pywps_version": "4.5.0",
"processes": [
{
"class": "processes.sayhello:SayHello",
"uuid": "None",
"workdir": null,
"version": "1.3.3.8",
"identifier": "say_hello",
"title": "Process Say Hello",
"abstract": "Returns a literal string output with Hello plus the inputed name",
"keywords": [],
"metadata": [],
"inputs": [
{
"identifier": "name",
"title": "Input name",
"abstract": "",
"keywords": [],
"metadata": [],
"type": "literal",
"data_type": "string",
"workdir": null,
"allowed_values": [],
"any_value": false,
"mode": 1,
"min_occurs": 1,
"max_occurs": 1,
"translations": null,
"data": "World"
}
],
"outputs": [
{
"identifier": "output",
"title": "Output response",
"abstract": "",
"keywords": [],
"data": null,
"data_type": "string",
"type": "literal",
"uoms": [],
"translations": null
}
],
"store_supported": "true",
"status_supported": "true",
"profile": [],
"translations": null
}
],
"language": "en-US"
}
GET Execute Request URL:
http://localhost:5000/wps?/service=wps&version=1.0.0&request=execute&Identifier=say_hello&storeExecuteResponse=true&DataInputs=name=Dude&f=json
GET Execute Response:
{
"status": {
"status": "succeeded",
"time": "2021-06-15T14:19:28Z",
"percent_done": "100",
"message": "PyWPS Process Process Say Hello finished"
},
"outputs": {
"output": "Hello Dude"
}
}
GET Execute Request URL (Raw output):
http://localhost:5000/wps?/service=wps&version=1.0.0&request=execute&Identifier=say_hello&storeExecuteResponse=true&DataInputs=name=Dude&RawDataOutput=output
GET Execute Response:
Hello Dude
The default mimetype (input and output formats) can be changed by setting the following headers of a POST request to one following values text/xml or application/json:
- Content-Type (format of the input)
- Accept (format of the output)
Example of a Say Hello POST request:
POST Execute Request URL:
http://localhost:5000/jobs
POST Execute Request Body:
{
"identifier": "say_hello",
"inputs": {
"name": "Dude"
}
}
POST Execute Response:
{
"status": {
"status": "succeeded",
"time": "2021-06-15T14:19:28Z",
"percent_done": "100",
"message": "PyWPS Process Process Say Hello finished"
},
"outputs": {
"output": "Hello Dude"
}
}
Example of a Say Hello POST request with raw output:
POST Execute Request Body:
{
"identifier": "say_hello",
"outputs": "output",
"inputs": {
"name": "Dude"
}
}
POST Execute Response:
Hello Dude
Alternatively, the identifier and optionally the raw output name can be encoded in the Request URL:
POST Execute Request URL (with identifier):
http://localhost:5000/jobs/say_hello
POST Execute Request Body:
{
"name": "Dude"
}
POST Execute Response:
{
"status": {
"status": "succeeded",
"time": "2021-06-15T14:19:28Z",
"percent_done": "100",
"message": "PyWPS Process Process Say Hello finished"
},
"outputs": {
"output": "Hello Dude"
}
}
POST Execute Request URL (with identifier and output name):
http://localhost:5000/jobs/say_hello/output
POST Execute Request Body:
{
"name": "Dude"
}
POST Execute Response:
Hello Dude
Example for a reference input:
"raster": {
"type": "reference",
"href": "file:./path/to/data/data.tif"
}
Example for a BoundingBox input: (bbox default axis order is yx (EPSG:4326), i.e. miny, minx, maxy, maxx)
"extent": {
"type": "bbox",
"bbox": [32, 34.7, 32.1, 34.8]
}
Example for a ComplexInput input: (the data is a standard GeoJSON)
"cutline": {
"type": "complex",
"data": {
"type": "FeatureCollection",
"name": "Center",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
34.76844787397541,
32.07247233606565
],
[
34.78658619364754,
32.07260143442631
],
[
34.77780750512295,
32.09532274590172
],
[
34.76844787397541,
32.07247233606565
]
]
]
}
}
]
}
}
The examples above show some Literal, 'Complex', BoundingBox inputs. Internally, PyWPS always keeps the inputs in JSON formats (also in previous versions) So potentially all input types that are supported in XML should also be supported in JSON, though only a small subset of them were tested in this preliminary implementation.
Multiple inputs for the same parameter can be passed by using a list as the parameter value.