dispatch

Dispatch or generate URLs or page paths. Useful to check dispatch rules or for client side code to dispatch page paths.

Dispatching URLs

The path returns the matched dispatch rule, controller, controller options, language, bindings and other dispatch information.

If no dispatch rule matches then 404 Not Found is returned.

Example:

curl -k 'https://example.test:8443/api/model/dispatch/get/path/nl/page/1234/hello'

Returns:

{
    "result": {
        "bindings": {
            "id": "1234",
            "z_language": "nl",
            "zotonic_site": "example",
            "zotonic_dispatch_path": [
                "page",
                "1234",
                "hello"
            ],
            "zotonic_dispatch": "page",
            "slug": "hello"
        },
        "controller": "controller_page",
        "site": "example",
        "language": "nl",
        "dispatch_rule": "page",
        "path_tokens": [
            "page",
            "1234",
            "hello"
        ],
        "controller_options": {
            "template": {
                "template": "page.tpl",
                "is_catinclude": true
            },
            "zotonic_dispatch_file": "dispatch",
            "zotonic_dispatch_module": "mod_site_whatwebwhat"
        }
    },
    "status": "ok"
}

Creating URLs

URLs or page paths can also be requested using the url_for method. Here the name of the dispatch rule is padded, optionally with any extra arguments.

Example:

curl -k 'https://example.test:8443/api/model/dispatch/get/url_for/admin'

Returns:

{"result":"/en/admin","status":"ok"}

Or, use abs_url_for if a complete URL with domain is needed:

curl -k 'https://example.test:8443/api/model/dispatch/get/abs_url_for/admin'

Returns:

{"result":"https://example.com/en/admin","status":"ok"}

And for more complex URLs:

curl -k 'https://example.test:8443/api/model/dispatch/get/url_for/page?id=1234&slug=foo&a=1&bar=baz'

Returns:

{"result":"/en/page/1234/foo?a=1&bar=baz","status":"ok"}

Here the selected dispatch rule was something like:

{page, [ "page", id, slug ], controller_page, [ {template, "page.tpl"} ]}

Because id and slug are part of the path, they are included in the generated URL path, the other arguments are added as query parameters.

Available Model API Paths

MethodPath patternDescription
get/urlDispatch full URL from payload field url, returning matched rule/controller/options/bindings for this site only (enoent on mismatch or no match). No further lookups.
get/url/+urlDispatch full URL +url, returning matched rule/controller/options/bindings when it resolves to the current site; otherwise enoent. No further lookups.
get/pathDispatch path from payload field path, returning matched rule/controller/options/bindings (enoent when no rule matches). No further lookups.
get/path/...Dispatch supplied path segments (percent-encoded and joined) and return matched rule/controller/options/bindings.
get/url_for/+name/...Generate relative URL for dispatch rule +name using payload args (path vars consumed by rule, remaining args as query params); enoent when rule is unknown.
get/abs_url_for/+name/...Generate absolute URL for dispatch rule +name from url_for result and current site host/scheme; enoent when rule is unknown.

/+name marks a variable path segment. A trailing /... means extra path segments are accepted for further lookups.

Edit on GitHub