SDK Generation

The @app.route(...) information you provide chalice allows it to create corresponding routes in API Gateway. One of the benefits of this approach is that we can leverage API Gateway's SDK generation process. Chalice offers a chalice generate-sdk command that will automatically generate an SDK based on your declared routes.

Note

The only supported language at this time is javascript.

Keep in mind that chalice itself does not have any logic for generating SDKs. The SDK generation happens service side in API Gateway, the chalice generate-sdk is just a high level wrapper around that functionality.

To generate an SDK for a chalice app, run this command from the project directory:

$ chalice generate-sdk /tmp/sdk

You should now have a generated javascript sdk in /tmp/sdk. API Gateway includes a README.md as part of its SDK generation which contains details on how to use the javascript SDK.

Example

Suppose we have the following chalice app:

from chalice import Chalice

app = Chalice(app_name='sdktest')

@app.route('/', cors=True)
def index():
    return {'hello': 'world'}

@app.route('/foo', cors=True)
def foo():
    return {'foo': True}

@app.route('/hello/{name}', cors=True)
def hello_name(name):
    return {'hello': name}

@app.route('/users/{user_id}', methods=['PUT'], cors=True)
def update_user(user_id):
    return {"msg": "fake updated user", "userId": user_id}

Let's generate a javascript SDK and test it out in the browser. Run the following command from the project dir:

$ chalice generate-sdk /tmp/sdkdemo
$ cd /tmp/sdkdemo
$ ls -la
-rw-r--r--   1 jamessar  r  3227 Nov 21 17:06 README.md
-rw-r--r--   1 jamessar  r  9243 Nov 21 17:06 apigClient.js
drwxr-xr-x   6 jamessar  r   204 Nov 21 17:06 lib

You should now be able to follow the instructions from API Gateway in the README.md file. Below is a snippet that shows how the generated javascript SDK methods correspond to the @app.route() calls in chalice.

<script type="text/javascript">
  // Below are examples of how the javascript SDK methods
  // correspond to chalice @app.routes()
  var apigClient = apigClientFactory.newClient();

  // @app.route('/')
  apigClient.rootGet().then(result => {
      document.getElementById('root-get').innerHTML = JSON.stringify(result.data);
  });

  // @app.route('/foo')
  apigClient.fooGet().then(result => {
      document.getElementById('foo-get').innerHTML = JSON.stringify(result.data);
  });

  // @app.route('/hello/{name}')
  apigClient.helloNameGet({name: 'jimmy'}).then(result => {
      document.getElementById('helloname-get').innerHTML = JSON.stringify(result.data);
  });

  // @app.route('/users/{user_id}', methods=['PUT'])
  apigClient.usersUserIdPut({user_id: '123'}, 'body content').then(result => {
      document.getElementById('users-userid-put').innerHTML = JSON.stringify(result.data);
  });
</script>

Example HTML File

If you want to try out the example above, you can use the following index.html page to test:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>SDK Test</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
        <script type="text/javascript" src="lib/axios/dist/axios.standalone.js"></script>
        <script type="text/javascript" src="lib/CryptoJS/rollups/hmac-sha256.js"></script>
        <script type="text/javascript" src="lib/CryptoJS/rollups/sha256.js"></script>
        <script type="text/javascript" src="lib/CryptoJS/components/hmac.js"></script>
        <script type="text/javascript" src="lib/CryptoJS/components/enc-base64.js"></script>
        <script type="text/javascript" src="lib/url-template/url-template.js"></script>
        <script type="text/javascript" src="lib/apiGatewayCore/sigV4Client.js"></script>
        <script type="text/javascript" src="lib/apiGatewayCore/apiGatewayClient.js"></script>
        <script type="text/javascript" src="lib/apiGatewayCore/simpleHttpClient.js"></script>
        <script type="text/javascript" src="lib/apiGatewayCore/utils.js"></script>
        <script type="text/javascript" src="apigClient.js"></script>


        <script type="text/javascript">
          // Below are examples of how the javascript SDK methods
          // correspond to chalice @app.routes()
          var apigClient = apigClientFactory.newClient();

          // @app.route('/')
          apigClient.rootGet().then(result => {
              document.getElementById('root-get').innerHTML = JSON.stringify(result.data);
          });

          // @app.route('/foo')
          apigClient.fooGet().then(result => {
              document.getElementById('foo-get').innerHTML = JSON.stringify(result.data);
          });

          // @app.route('/hello/{name}')
          apigClient.helloNameGet({name: 'jimmy'}).then(result => {
              document.getElementById('helloname-get').innerHTML = JSON.stringify(result.data);
          });

          // @app.route('/users/{user_id}', methods=['PUT'])
          apigClient.usersUserIdPut({user_id: '123'}, 'body content').then(result => {
              document.getElementById('users-userid-put').innerHTML = JSON.stringify(result.data);
          });
        </script>
    </head>
    <body>
        <div><h5>result of rootGet()</h5><pre id="root-get"></pre></div>
        <div><h5>result of fooGet()</h5><pre id="foo-get"></pre></div>
        <div><h5>result of helloNameGet({name: 'jimmy'})</h5><pre id="helloname-get"></pre></div>
        <div><h5>result of usersUserIdPut({user_id: '123'})</h5><pre id="users-userid-put"></pre></div>
    </body>
</html>