E07671: a service URI needs 'for' before it and an HTTP verb needs 'as' before it

Category: E07xxx Full resolution · Reported in phase: SYMBOL_DEFINITION · Classification: SERVICE_KEYWORD_REQUIRED · All error codes

What went wrong

A service is written in one form: 'for' before every URI, and 'as' before an HTTP verb. The service's own URI ('Items for :/items open'), each method's ('byId() as GET for :/{id}') and each operator's ('operator += for :/') all take 'for'; a method that names its verb takes 'as' before it. A declaration with either word missing is this error, reported at the URI or the verb it belongs before.

Worked examples

Compilable examples demonstrating this error and the correct fix:

  • ek9 -q 657 (How does service URI mapping work with :/path syntax?)

How to fix it

  1. Write 'for' before the URI: 'Items for :/items', not 'Items :/items'
  2. Write 'as' before the verb: 'byId() as GET for :/{id}' (not 'byId() GET for :/{id}')
  3. Each has one reading, so the MCP editing tools (ek9_edit_file, ek9_write_file, ek9_compile) insert the missing word for you. By hand: add the word as above.

The [EXAMPLE] section below shows a service and a method each missing a word, and the same service in its one form.

Common causes

  • Following an older example that left 'for' or 'as' out
  • Reading 'GET' as an annotation rather than the verb of the declaration

See also

  • E07671: a service URI without 'for', or an HTTP verb without 'as' (this error)
  • E07670: unsupported service operator
  • E07680: a path variable in the service's own URI

Examples

Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.

Fails with E07671: a service URI needs 'for' before it and an HTTP verb needs 'as' before it

#!ek9
defines module error.e07671.bad

  defines class

    TextResponse with trait of HTTPResponse
      text as String?

      default private TextResponse()

      TextResponse()
        -> body as String
        this.text: body

      override contentType() as pure
        <- rtn as String: "text/plain"

      override content()
        <- rtn as Bytes: Bytes().withUtf8(text)

      override status() as pure
        <- rtn as Integer: 200

      default operator ?

  defines service

    //A URI is written after 'for'
    Addresses :/addresses open //wrong: no 'for' before the URI

      //An HTTP verb is written after 'as'
      byId() GET for :/{id} //wrong: no 'as' before the verb
        -> id as String
        <- response as HTTPResponse: TextResponse(`address ${id}`)

Fixed: Write 'for' before every URI and 'as' before the HTTP verb

#!ek9
defines module error.e07671.good

  defines class

    TextResponse with trait of HTTPResponse
      text as String?

      default private TextResponse()

      TextResponse()
        -> body as String
        this.text: body

      override contentType() as pure
        <- rtn as String: "text/plain"

      override content()
        <- rtn as Bytes: Bytes().withUtf8(text)

      override status() as pure
        <- rtn as Integer: 200

      default operator ?

  defines service

    Addresses for :/addresses open

      byId() as GET for :/{id}
        -> id as String
        <- response as HTTPResponse: TextResponse(`address ${id}`)

      operator += for :/
        -> incoming as String :=: CONTENT
        <- response as HTTPResponse: TextResponse(incoming)

Questions and answers

These Q&A entries show E07671 and its fix: