---
name: "Web::Dispatch::HTTPMethods"
section: "3pm"
platform: "linux"
package: "libweb-simple-perl"
version: "0.033-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Web::Dispatch::HTTPMethods"
---

# Web::Dispatch::HTTPMethods(3pm)

Helpers to make RESTFul Dispatchers Easier

## NAME

Web::Dispatch::HTTPMethods - Helpers to make RESTFul Dispatchers Easier

## SYNOPSIS

```
    package MyApp:WithHTTPMethods;
    use Web::Simple;
    use Web::Dispatch::HTTPMethods;
    sub as_text {
      [200, ['Content-Type' => 'text/plain'],
        [$_[0]->{REQUEST_METHOD}, $_[0]->{REQUEST_URI}] ]
    }
    sub dispatch_request {
      sub (/get) {
        GET { as_text(pop) }
      },
      sub (/get-head) {
        GET { as_text(pop) }
        HEAD { [204,[],[]] },
      },
      sub (/get-post-put) {
        GET { as_text(pop) }  ## NOTE: no commas separating http methods
        POST { as_text(pop) }
        PUT { as_text(pop) }
      },
    }
```

## DESCRIPTION

Exports the most commonly used HTTP methods as subroutine helpers into your Web::Simple based application. Use of these methods additionally adds an automatic HTTP code 405 `"Method Not Allowed"` response if none of the HTTP methods match for a given dispatch and also adds a dispatch rule for `"HEAD"` if no `"HEAD"` exists but a `"GET"` does (in which case the `"HEAD"` returns the `"GET"` dispatch with an empty body.)

We also add support at the end of the chain for the OPTIONS method. This defaults to HTTP 200 OK + Allows http headers.

We also try to set correct HTTP headers such as `"Allows"` as makes sense based on your dispatch chain.

The following dispatch chains are basically the same:

```
    sub dispatch_request {
      sub (/get-http-methods) {
        GET { [200, ['Content-Type' => 'text/plain'], ['Hello World']] }
      },
      sub(/get-classic) {
        sub (GET) { [200, ['Content-Type' => 'text/plain'], ['Hello World']] },
        sub (HEAD)  { [200, ['Content-Type' => 'text/plain'], []] },
        sub (OPTIONS)  {
          [200, ['Content-Type' => 'text/plain', Allows=>'GET,HEAD,OPTIONS'], []];
        },
        sub () {
          [405, ['Content-Type' => 'text/plain', Allows=>'GET,HEAD,OPTIONS'],
           ['Method Not Allowed']]
        },
      }
    }
```

The idea here is less boilerplate to distract the reader from the main point of the code and also to encapsulate some best practices.

**NOTE** You currently cannot mix http method style and prototype sub style in the same scope, as in the following example:

```
    sub dispatch_request {
      sub (/get-head) {
        GET { ... }
        sub (HEAD) { ... }
      },
    }
```

If you try this our code will notice and issue a `"die"`.  If you have a good use case please bring it to the authors.

### EXPORTS

This automatically exports the following subroutines:

```
    GET
    PUT
    POST
    HEAD
    DELETE
    OPTIONS
```

## AUTHOR

See Web::Simple for AUTHOR

## CONTRIBUTORS

See Web::Simple for CONTRIBUTORS

## COPYRIGHT

See Web::Simple for COPYRIGHT

## LICENSE

See Web::Simple for LICENSE
