JSON запрос через iOS и запрос кодирования в остальных сетях? - PullRequest
0 голосов
/ 19 апреля 2019

Запрос на публикацию из моего приложения для iOS выглядит примерно так:

Request: {“pod_id”:“F11",“type”:“Normal Activity”,“time_stamp”:“2019-0417T22:29:35.14Z”,“url”:“https:\/\/s3.amazonaws.com\/****\/******\/2019-04-17\/*******-22:29:35.json”}

Но backend / rest-api ожидает файл JSON в формате:

The request body should be a "application/json" encoded object, containing the following items.

Parameter       Description
name    
time_stamp  
duration    
type

Должен ли запрос быть того же формата, который ожидает внутренний сервер?

Это один из проектов, в котором я работаю в качестве члена iOS, и у нас есть бэкэнд-команда, которая расширяет REST API. Мне нужно публиковать данные, собирая их из приложения iOS в http://asdasdasd/api/post-act. Но, как уже упоминалось, ожидается другой формат, по сравнению с тем, что я передаю, и, следовательно, я получаю 400 ошибок. Я изменил его так, что я передаю прямо JSON, то есть JSON из URL-адреса из вышеприведенного запроса, но опять-таки он имеет поля, отличные от ожидаемых JSON на бэкэнде.

 /*request-setup
 void)setupRequestManager {
self.afRequestManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:EndPointBaseURL]];
self.afRequestManager.responseSerializer = [AFJSONResponseSerializer serializer];
self.afRequestManager.requestSerializer = [AFJSONRequestSerializer serializer];

1 Ответ

0 голосов
/ 19 апреля 2019

Создайте структуру запроса следующим образом.

Swift

struct Request: Codable {
    let podID, type, timeStamp: String
    let url: String

    enum CodingKeys: String, CodingKey {
        case podID = "pod_id"
        case type
        case timeStamp = "time_stamp"
        case url
    }
}

Создайте объект Struct и установите все значения.JSON Кодировать объект запроса при передаче его в API следующим образом.

let httpBody = try JSONEncoder().encode(request)
apiRequest.body = httpBody

Убедитесь, что Content-Type в заголовках ApiRequest установлен как "application / json"

Content-Type : application/json 

Таким образом,Вы можете передать JSON как запрос в вызовах API REST.

Objective-C

Request.h

@class TESTRequest;

NS_ASSUME_NONNULL_BEGIN

#pragma mark - Object interfaces

@interface TESTRequest : NSObject
@property (nonatomic, copy) NSString *podID;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *timeStamp;
@property (nonatomic, copy) NSString *url;

+ (_Nullable instancetype)fromJSON:(NSString *)json encoding:(NSStringEncoding)encoding error:(NSError *_Nullable *)error;
+ (_Nullable instancetype)fromData:(NSData *)data error:(NSError *_Nullable *)error;
- (NSString *_Nullable)toJSON:(NSStringEncoding)encoding error:(NSError *_Nullable *)error;
- (NSData *_Nullable)toData:(NSError *_Nullable *)error;
@end

NS_ASSUME_NONNULL_END

Request.m

NS_ASSUME_NONNULL_BEGIN

#pragma mark - Private model interfaces

@interface TESTRequest (JSONConversion)
+ (instancetype)fromJSONDictionary:(NSDictionary *)dict;
- (NSDictionary *)JSONDictionary;
@end

#pragma mark - JSON serialization

TESTRequest *_Nullable TESTRequestFromData(NSData *data, NSError **error)
{
    @try {
        id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:error];
        return *error ? nil : [TESTRequest fromJSONDictionary:json];
    } @catch (NSException *exception) {
        *error = [NSError errorWithDomain:@"JSONSerialization" code:-1 userInfo:@{ @"exception": exception }];
        return nil;
    }
}

TESTRequest *_Nullable TESTRequestFromJSON(NSString *json, NSStringEncoding encoding, NSError **error)
{
    return TESTRequestFromData([json dataUsingEncoding:encoding], error);
}

NSData *_Nullable TESTRequestToData(TESTRequest *request, NSError **error)
{
    @try {
        id json = [request JSONDictionary];
        NSData *data = [NSJSONSerialization dataWithJSONObject:json options:kNilOptions error:error];
        return *error ? nil : data;
    } @catch (NSException *exception) {
        *error = [NSError errorWithDomain:@"JSONSerialization" code:-1 userInfo:@{ @"exception": exception }];
        return nil;
    }
}

NSString *_Nullable TESTRequestToJSON(TESTRequest *request, NSStringEncoding encoding, NSError **error)
{
    NSData *data = TESTRequestToData(request, error);
    return data ? [[NSString alloc] initWithData:data encoding:encoding] : nil;
}

@implementation TESTRequest
+ (NSDictionary<NSString *, NSString *> *)properties
{
    static NSDictionary<NSString *, NSString *> *properties;
    return properties = properties ? properties : @{
        @"pod_id": @"podID",
        @"type": @"type",
        @"time_stamp": @"timeStamp",
        @"url": @"url",
    };
    }

    + (_Nullable instancetype)fromData:(NSData *)data error:(NSError *_Nullable *)error
{
    return TESTRequestFromData(data, error);
    }

    + (_Nullable instancetype)fromJSON:(NSString *)json encoding:(NSStringEncoding)encoding error:(NSError *_Nullable *)error
{
    return TESTRequestFromJSON(json, encoding, error);
    }

    + (instancetype)fromJSONDictionary:(NSDictionary *)dict
{
    return dict ? [[TESTRequest alloc] initWithJSONDictionary:dict] : nil;
    }

    - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
{
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
    }

    - (void)setValue:(nullable id)value forKey:(NSString *)key
{
    id resolved = TESTRequest.properties[key];
    if (resolved) [super setValue:value forKey:resolved];
    }

    - (NSDictionary *)JSONDictionary
        {
            id dict = [[self dictionaryWithValuesForKeys:TESTRequest.properties.allValues] mutableCopy];

            // Rewrite property names that differ in JSON
            for (id jsonName in TESTRequest.properties) {
                id propertyName = TESTRequest.properties[jsonName];
                if (![jsonName isEqualToString:propertyName]) {
                    dict[jsonName] = dict[propertyName];
                    [dict removeObjectForKey:propertyName];
                }
            }

            return dict;
        }

        - (NSData *_Nullable)toData:(NSError *_Nullable *)error
{
    return TESTRequestToData(self, error);
    }

    - (NSString *_Nullable)toJSON:(NSStringEncoding)encoding error:(NSError *_Nullable *)error
{
    return TESTRequestToJSON(self, encoding, error);
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...