AWS APIGateway の REST API で生成した JavaScript SDK で、パスパラメータ付きのメソッド呼び出しが失敗していました。API は コンソールで Swagger のYaml をインポートしていましたが、その定義が良くなかったようです。
//APIクライアント生成
const api = apigClientFactory.newClient({
"apiKey": "XXXXXX...",
…
});
// GET <endpoint>/data/{id} を呼び出す
const response = await api.dataIdGet(
{id:"xxx"}, {});
// GET <endpoint>/data が呼び出されてしまう
直接 SDKのソースを見ると、このメソッドのリソースパスを生成する箇所で、明らかにパスパラメータが展開されていませんでした。
parseParametersToObjectの第2引数が空の配列になっている(以下のここが空っぽ
のコメント部)ため、GET /data/
を実行してしまう。
apiGateway-js-sdk/apigClient.js
:
apigClient.dataIdGet = function (params, body,
additionalParams)
{
if(additionalParams === undefined) {
additionalParams = {};
}
apiGateway.core.utils
.assertParametersDefined(params, [], ['body']);
var dataIdGetRequest = {
verb: 'get'.toUpperCase(),
path: pathComponent + uritemplate('/data/{id}')
.expand(apiGateway.core.utils
.parseParametersToObject(params, [ ])),
//ここが空っぽ ↑
headers: apiGateway.core.utils
.parseParametersToObject(params, []),
queryParams: apiGateway.core.utils
.parseParametersToObject(params, []),
body: body
};
return apiGatewayClient.makeRequest(
dataIdGetRequest, authType,
additionalParams, config.apiKey);
};
とりあえずこの配列にパスパラメータ名 "id"
を入れてやれば正しく呼び出せるようになりました(以下)。
var dataIdGetRequest = {
verb: 'get'.toUpperCase(),
path: pathComponent + uritemplate('/data/{id}')
.expand(apiGateway.core.utils
.parseParametersToObject(params, ['id'])),
//パスパラメータ名を定義↑
しかしこれでは根本的に解決しません。SDKが更新されるたびに編集しなおすなんてやってられませんからね。
で、調べてみると、パスパラメータをリソース/data/{id}
に対して定義していたのがいけなかったと判明しました。Swagger的には問題ないはずなのですが、API Gatewayにインポートする場合、「パスパラメータはメソッドに対して定義する必要がある」ようです。
どちらの場合でも、API Gateway のコンソールではパスパラメータとして認識されていますが、デプロイ済みのAPIで生成するJavaScriptのSDKでは違いが出るみたいです(他言語のSDKでどうなっているのかは不明)。もしかするとAWS側のバグなのかもしれません。
0 件のコメント:
コメントを投稿