I am using the OpenWhisk provider for Serverless, and am using the IBM Cloud implementation of OpenWhisk.
I am trying to create a REST API. One representative piece of this API would deal with categories. I’d like endpoints like:
GET /categories
GET /categories/{categoryId}
The first endpoint returns a collection of categories, and the second returns one specific category.
The first endpoint is working fine. No problem. I’m having trouble, however, getting the second endpoint to work. I tried with yml like the following:
categories:
handler: handler.categories
annotations:
web-export: true
events:
- http:
path: categories/{categoryId}
method: get
resp: http
but I received an error when running sls deploy -v
:
...
Serverless: Deploying API Gateway Route: {"relpath":"categories/{categoryId}","operation":"get","responsetype":"http","action":"/_/categories-dev-categories","basepath":"/categories"}
Serverless Error ---------------------------------------
Failed to deploy API Gateway route (categories/{categoryId}) due to error: POST https://openwhisk.ng.bluemix.net/api/v1/web/whisk.system/apimgmt/createApi.http?responsetype=http&accesstoken=token&spaceguid=guid Returned HTTP 502 (Bad Gateway) --> "API creation failure: Cannot read property 'name' of undefined"
Get Support --------------------------------------------
Docs: docs.serverless.com
Bugs: github.com/serverless/serverless/issues
Forums: forum.serverless.com
Chat: gitter.im/serverless/serverless
Your Environment Information -----------------------------
OS: darwin
Node Version: 8.9.4
Serverless Version: 1.26.1
If I omit /{categoryId}
from the path, then the endpoint is successfully created but only works for exact matches with /categories (i.e. my first endpoint). Any deviation from it results in 404 errors. Reasonable enough but not what I need here.
I was able to create an API endpoint that meets my needs with:
bx wsk api create /categories /categories get categories-dev-categories --response-type http
This is not identical to the /categories/{categoryId} endpoint I described above because it lacks the path variable, but it works ok because it accepts anything after /categories/ and captures it in the __ow_path variable so I can parse __ow_path and process accordingly.
I am hoping to be able to create this endpoint in Serverless so I don’t need to be running OpenWhisk commands outside of Serverless. I’d prefer to deploy with a single Serverless command rather than with a Serverless command followed by a collection of OpenWhisk API calls.
Any suggestions? Am I doing something wrong?
Thanks for your help!