Как вызвать мой AWS API Gateway REST API в моем проекте iOS / Swift - PullRequest
0 голосов
/ 10 февраля 2019

Я создал приложение Single View в Xcode , а затем следовал руководству по AWS Amplify iOS SDK, чтобы вставить аутентификацию с использованием моего существующего пула пользователей Cognito.Работал прекрасно.

Затем, используя AWS Amplify, я добавил REST API , чтобы позволить моему приложению iOS получить доступ к существующей таблице DynamoDB через сгенерированный Amplify API Gateway и функцию Lambda,Однако мне пришлось все заново подключить, чтобы использовать мой ранее существующий пул пользователей Cognito, поскольку Amplify CLI неожиданно создал новый пул пользователей, связанный с созданным им REST API.

Я получаю следующую ошибкупри попытке вызвать мой API, и независимо от того, что я делаю, я не могу заставить его уйти:

Optional("{\"message\":\"Authorization header requires \'Credential\' parameter. 
Authorization header requires \'Signature\' parameter. Authorization header requires 
\'SignedHeaders\' parameter. 
Authorization=abJarWQiOiJyR0NiTHFsbVwvbWdGeXgzcVA1YmNRaV...
403

ОБНОВЛЕНИЕ 5 Для получения дополнительной информации, пожалуйста, см. мой Усиление AWSВыпуск iOS SDK .:)

ОБНОВЛЕНИЕ 4 Это обновление имеет приоритет перед моими более ранними обновлениями, потому что теперь кажется ясным - как показывает ошибка выше - что я неправильно вызываю мой REST API через аутентифицированного пользователя Cognitoмоего приложения для iOS.Я заметил, что Amplify создал пул пользователей с двумя клиентами приложения, один для веб-доступа и один для мобильного доступа.У моего ранее существующего пула пользователей был только один клиент приложения, настроенный для веб-доступа.Поэтому я создал новый клиент приложения для мобильного доступа с секретом приложения клиента.

К сожалению, я получаю точно такую ​​же ошибку.Так что мне интересно, нужно ли что-то еще перемонтировать;или, возможно, у меня есть проблема с токеном.Как я уже упоминал в комментарии ниже, возможно, мне не следует использовать токен OIDC, как указано в руководстве по REST API?Может мне стоит использовать AWS Credentials ? END UPDATE 4

Мой API имеет один ресурс /items, и у меня есть метод ANY и OPTIONS.Метод ANY не имеет параметров строки запроса URL-адреса, указанных для запроса метода.Но для тела запроса указано RequestSchema типа application/json.

Моя функция вызова API в точности соответствует , указанному в AWS Amplify iOS SDK для REST API (Iследовал их инструкциям по вызову моей конечной точки API Gateway с помощью авторизатора Cognito User Pools), за исключением того, что я изменил httpMethodName с POST на GET, потому что POST вызвал сбой.Вот как это выглядит:

func doInvokeAPI(token:String) {
        // change the method name, or path or the query string parameters here as desired
        let httpMethodName = "GET"
        // the guid is the partition key for the DynamoDB table
        let URLString = "/items/178dc797-4e3d-5bc4-815f-a280536fcd3a"
        //let queryStringParameters = ["key1":"{value1}"]
        let headerParameters = [
            "Content-Type": "application/json",
            "Accept": "application/json",
            "Authorization": token
        ]

        //let httpBody = "{ \n  " +
        //    "\"key1\":\"value1\", \n  " +
        //    "\"key2\":\"value2\", \n  " +
        //    "\"key3\":\"value3\"\n}"


        // Construct the request object
        let apiRequest = AWSAPIGatewayRequest(httpMethod: httpMethodName,
                                              urlString: URLString,
                                              queryParameters: nil,
                                              headerParameters: headerParameters,
                                              httpBody: nil)

...
...
        invocationClient.invoke(apiRequest).continueWith { (task: AWSTask) -> Any? in
            if let error = task.error {
                print("Error occurred: \(error)")
                // Handle error here
                return nil
            }

            // Handle successful result here
            let result = task.result!
            let responseString = String(data: result.responseData!, encoding: .utf8)

            print(responseString as Any)
            print(result.statusCode)

            return nil
        }
    }

Ошибка, приведенная выше, напечатана тем, что print(responseString).

Моя таблица DynamoDB ожидает: ключ раздела userId.Строка Guid.

Я почти уверен, что все, что я хочу передать API - это один userId, чтобы API мог получить все элементы, связанные с ним.Нет необходимости в моем ключе сортировки.

Есть ли проблема с тем, как я делаю этот запрос GET через API-интерфейс REST API шлюза?

ОБНОВЛЕНИЕ 1 Существует два JavaScriptфайлы, связанные с моей функцией Lambda: index.js и app.js, созданные Amplify.

index.js очень короткие:

const awsServerlessExpress = require('aws-serverless-express');
const app = require('./app');

const server = awsServerlessExpress.createServer(app);

exports.handler = (event, context) => {
  console.log(`EVENT: ${JSON.stringify(event)}`);
  awsServerlessExpress.proxy(server, event, context);
};

И app.js состоит из некоторого набора(первый скриншот), а затем ряд методов для get, put, post, delete.Я просто включаю два скриншота для get методов - предмет этого вопроса).

enter image description here

enter image description here

enter image description here

ОБНОВЛЕНИЕ 2 Вот что я вижу, когда нажимаю Запрос на интеграцию для метода ANY моего API.Обратите внимание, что у меня нет раскрывающегося списка для шаблона отображения.

enter image description here

ОБНОВЛЕНИЕ 3 Но у меня есть Prod этап, созданный Amplify.Но я все еще не вижу шаблона отображения нигде в поле зрения.

enter image description here

1 Ответ

0 голосов
/ 13 февраля 2019

"/items/{userId}" это просто строка.Попробуйте "/items/\(userId)"

Извините, у меня недостаточно очков для добавления комментария.

...