Клиент AWS API Gateway для iOS возвращает ошибку Не удалось сериализовать тело JSON

Я определил свой REST API с помощью AWS API Gateway и сгенерировал клиентский код для iOS. Когда я вызываю метод, SDK выводит это сообщение об ошибке:

AWSiOSSDKv2 [Error] 
AWSAPIGatewayClient.m line:190
__118-[AWSAPIGatewayClient invokeHTTPRequest:URLString:pathParameters:
queryParameters:headerParameters:body:responseClass:]_block_invoke_2 | 
Failed to serialize the body JSON. 
(null)

Что случилось?


person rjobidon    schedule 18.03.2016    source источник


Ответы (1)


Легкий!

  1. Убедитесь, что ваша модель AWSModel имеет то же количество членов класса, что и количество ключей свойств JSON key paths. У моего нет члена класса и 2 ключа свойств.

  2. Убедитесь, что имя каждого ключа свойства совпадает с именем члена класса. Опять же, у меня был ключ для «кода» и не было соответствующего свойства «код».

Для ясности посмотрите на функцию JSONKeyPathsByPropertyKey. Если вы видите @"abc": @"def", то в вашем классе должно быть свойство "abc", иначе преобразование JSON завершится ошибкой.

// Sample JSON returned by AWS API Gateway
{"code":200, "message":"OK", "data":{"phone":"(555) 555-1234"}}
// APISample.h

#import 
#import 

@interface APISample : AWSModel

// We count 4 class members
@property (nonatomic, strong) NSNumber *code;
@property (nonatomic, strong) NSString *message;
@property (nonatomic, strong) NSDictionary *data;
@property (nonatomic, strong) NSNumber *phone;

@end
// APISample.m

#import "APISample.h"

@implementation APISample

// We count 4 property keys
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
             @"code": @"code",
             @"message": @"message",
             @"data": @"data",
             @"phone": @"data.phone"
             };
}

Совет: обратите внимание, как вы можете получить доступ к ветке (данные как NSDictionary) и пройти по структуре документа с точечной нотацией (data.phone).

Бонус: рабочий пример Swift специально для вас.

// Swift sample code to access AWS API Gateway under iOS

// Create a client with public access
var client : APISampleClient = APISampleClient.defaultClient()

// Comment next line if your API method does not need API key
client.APIKey = "Your API key"

client.SampleMethodGet().continueWithBlock { (task : AWSTask) -> AnyObject? in

  if task.error != nil { 
    print("Error \(task.error)") 
  }
  else if task.result != nil {
    let output = task.result as! APISample
    print("Success \(output)")
  }
  return nil
}
person rjobidon    schedule 18.03.2016