Зачем вызывать REST API (прокси-сервер API-шлюза), который вызывает API-интерфейс сканирования DynamoDB, возвращая пустой массив элементов? - PullRequest
0 голосов
/ 20 апреля 2020

Я успешно создал и протестировал в API Gateway Console API REST Service Proxy, возвращающий все элементы в таблице DynamoDB с помощью Scan API. И чтобы сделать ответ БД как объекта JSON, я добавил шаблон сопоставления в «Интеграционный ответ», который преобразует ответ следующим образом:

{
  "tableItems": [
      { // item_1
        "attribute_1": "value",
        "attribute_2": "someValue"
      },
      { //item_2
        "attribute_1": "value",
        "attribute_2": "someValue"
      },
      { //item_3
        "attribute_1": "value",
        "attribute_2": "someValue"
      }
   ]
}

Но затем я включил CORS (оставив все параметры по умолчанию), развернул API с этапом тестирования 'beta' и, наконец, вызвал его в веб-приложении, используя метод jQuery $ .get (). Я получил следующий ответ с пустым массивом «tableItems»:

{
   "tableItems": []
}

Подозревая что-то не так в разделе «Ответ метода» шлюза API, я проверил настройки «Тело ответа на 200». Тип контента был установлен на «application / json» с моделями «Empty». По-видимому, я не могу изменить последние значения.

Обновление:

Чтобы углубиться в проблему root, я включил журналы Cloudwatch для Api Gateway, и вызвать конечную точку REST API GET следующим образом:

$.get("https://my_api_id.execute-api_region.amazonaws.com/beta/get-items/{tablename}", { 
     tablename: "abc"
})
.then(res => console.log(res))
.catch(err => console.error(err));

В журналах я получаю следующую информацию:

{
    "requestId": "...",
    "ip": "...",
    "caller": "-",
    "user": "-",
    "requestTime": "21/Apr/2020:08:03:41 +0000",
    "httpMethod": "GET",
    "resourcePath": "/get-items/{tablename}",
    "status": "200",
    "protocol": "HTTP/1.1",
    "responseLength": "44"   <--- to probe
}

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Просто выложите это здесь для любого, кто сталкивается с подобной проблемой -

Может быть больше, чем одна возможность, почему база данных посылала пустой ответ. В этом случае выглядело так, как будто запрос не был полностью отправлен из API Gateway, как ожидалось БД. Лучшим способом устранения таких проблем было бы включить журналы выполнения API-шлюза с полным параметром запроса / ответа.

В этих журналах указывается, как запрос был получен от API-шлюза от клиента и как он был изменен (с помощью шаблонов сопоставления) и перенаправлен на интеграцию (в данном случае это база данных).

0 голосов
/ 21 апреля 2020

Вся проблема в том, что используется самый путь URL /get-items/{tablename}.

{tablename} является символическим c представлением значения параметра запроса. Именно здесь следует добавить значение abc из tablename параметра запроса, и поэтому символ должен быть заменен.

Следовательно, правильной конечной точкой API будет:

https://my_api_id.execute-api_region.amazonaws.com/beta/get-items/abc
...