0

複雑な JSON オブジェクトを投稿する必要がある API があります。API はプリミティブ ID (またはエラー オブジェクト) を保存して応答します。プリミティブ ID をマップできません。何か案は?以下の例では、簡単にするために POST オブジェクトのマッピングを行っていませんが、一部の API 呼び出しではそれも必要になります。

RestKit を使用してリクエストを作成し、それを AFNetworking に渡すという提案を見ましたが、これはエラーが返される可能性のあるオブジェクトを解析しません。

RKObjectMapping* map = [RKObjectMapping mappingForClass:[MyPrimitiveResponse class]];
[map addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"success"]];

RKResponseDescriptor *errDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[MyErrorResponse objectMap] method:RKRequestMethodGET  pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassServerError)];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:map method:RKRequestMethodGET pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

NSURL *URL = [NSURL URLWithString:apiUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[ errDescriptor, responseDescriptor ]];
[objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    RKLogInfo(@"Load collection of Articles: %@", mappingResult.array);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    RKLogError(@"Operation failed with error: %@", error);
}];

[objectRequestOperation start];

デバッガーで次のエラーが表示されます。

2013-10-29 10:23:15.196 TestParser[6988:70b] E app:MyHomeViewController.m:54 Operation failed with error: Error Domain=org.restkit.RestKit.ErrorDomain Code=-1017 "Loaded an unprocessable response (200 ) with content type 'application/json'" UserInfo=0x8daca20 {NSErrorFailingURLKey=....., NSUnderlyingError=0x8db4cd0 "The operation could't be completed. (Cocoa error 3840.)", NSLocalizedDescription=Loaded an unprocessable response (200 ) コンテンツ タイプ 'application/json' を持つ}

更新:
これは、この状況を処理するための最後のコードです。それは他の人に役立つかもしれません...

// Manually Map Request to JSON & send to server
NSDictionary *parameters = [RKObjectParameterization parametersWithObject:payload requestDescriptor:[payload.class requestDescriptor] error:&error];
NSMutableURLRequest* request = [self.apiManager requestWithObject:nil method:RKRequestMethodPOST path:url parameters:parameters];

RKHTTPRequestOperation *requestOperation = [[RKHTTPRequestOperation alloc] initWithRequest:request];
[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    unichar firstChar = [operation.responseString characterAtIndex:0];
    NSData *newData;
    if (firstChar != '{' && firstChar != '[') {
        // Force into JSON array so it can be parsed normally
        newData = [[[@"[" stringByAppendingString:operation.responseString] stringByAppendingString:@"]"] dataUsingEncoding:NSUTF8StringEncoding]; 
    } else {
        newData = operation.responseData;
    }

    // Parse JSON response into native object, whether primitive NSNumber (integer or boolean) response or a full fledged JSON error object.
    RKResponseDescriptor *errDescriptor = [MyErrorResponse responseDescriptor];
    RKObjectResponseMapperOperation* mapper = [[RKObjectResponseMapperOperation alloc] initWithRequest:request response:operation.response data:newData responseDescriptors:@[errDescriptor, [payload.class responseDescriptor]]];
    [mapper setDidFinishMappingBlock:^(RKMappingResult *mappingResult, NSError *error) {
        if (mappingResult) { //Success
            RKLogInfo(@"Load response: %@", mappingResult.firstObject);
        } else {
            RKLogError(@"Operation failed with error: %@", error);
        }
    }];
    [mapper start];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    RKLogError(@"Operation failed with error: %@", error);
}];

[requestOperation start];
4

1 に答える 1