0

RKXMLReaderSerialization を使用しており、サーバーからの XML 応答をオブジェクトにマップしようとしています。成功しますが、マッピング結果のオブジェクトには空の値しかありません。

サーバーからマッピングしようとしている text/xml 応答は次のとおりです。

<Provision version="1.0">
  <FileInfoWrapper>
    <FileUrl>SomeFile.zip</FileUrl>
    <FileName>SomeFile.zip</FileName>
    <FileSha1>oi7NK/rFLL6dXqcu7ahaNfKsGkE=</FileSha1>
    <FileSize>52220448</FileSize>
    <Version>13</Version>
    <Vital>true</Vital>
  </FileInfoWrapper>
</Provision>

ここに私のモデルオブジェクトがあります:

@interface FileInfoWrapper : NSObject

@property NSString *fileUrl;
@property NSString *fileName;
@property NSString *fileSha1;
@property long fileSize;
@property NSString *version;
@property BOOL vital;

@end

RKXMLReaderSerialization を追加しました:

[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:RKMIMETypeTextXML];
[[self objectManager] setAcceptHeaderWithMIMEType:@"application/json,text/xml"];

マッピングと応答記述子が正しく設定されていると思います。

RKObjectMapping *fileInfoMapping = [RKObjectMapping mappingForClass:[FileInfoWrapper class]];
[fileInfoMapping addAttributeMappingsFromDictionary:@{
 @"FileUrl":        @"fileUrl",
 @"FileName":       @"fileName",
 @"FileSha1":       @"fileSha1",
 @"FileSize":       @"fileSize",
 @"Version":        @"version",
 @"Vital":          @"vital"}];
RKResponseDescriptor *fileInfoResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:fileInfoMapping
                                                                                                method:RKRequestMethodGET
                                                                                           pathPattern:nil
                                                                                               keyPath:@"Provision.FileInfoWrapper"
                                                                                           statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[self objectManager] addResponseDescriptor:fileInfoResponseDescriptor];

しかし、私が電話すると:

[[self objectManager] getObjectsAtPath:@"static/download/Installer.info.xml"
                            parameters:nil
                               success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                   NSLog(@"****Success!****");
                                   NSLog(@"mappingResult: %@", mappingResult);
                                   FileInfoWrapper *fileInfo = [mappingResult firstObject];
                                   NSLog(@"URL: %@", [fileInfo fileUrl]);
                                   NSLog(@"Name: %@", [fileInfo fileName]);
                                   NSLog(@"SHA1: %@", [fileInfo fileSha1]);
                                   NSLog(@"Size: %lx", [fileInfo fileSize]);
                               }
                               failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                   NSLog(@"****Failure!****");
                               }];

すべての値が null です。

I restkit.network:RKObjectRequestOperation.m:180 GET 'http://example.com/static/download/Installer.info.xml'
I restkit.network:RKObjectRequestOperation.m:250 GET 'http://example.com/static/download/Installer.info.xml' (200 OK / 1 objects) [request=0.1080s mapping=0.0060s total=0.1226s]
****Success!****
mappingResult: <RKMappingResult: 0x10064b190, results={
    "Provision.FileInfoWrapper" = "<FileInfoWrapper: 0x10065f780>";
}>
URL: (null)
Name: (null)
SHA1: (null)
Size: 0

私は何を間違っていますか?

更新: RestKit/ObjectMapping ログを有効にして、追加情報を取得しました:

D restkit.object_mapping:RKMapperOperation.m:377 Executing mapping operation for representation: {
    Provision =     {
        FileInfoWrapper =         {
            FileName =             {
                text = "SomeFile.zip";
            };
            FileSha1 =             {
                text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE=";
            };
            …
}
 and targetObject: (null)
T restkit.object_mapping:RKMapperOperation.m:320 Examining keyPath 'Provision.FileInfoWrapper' for mappable content...
D restkit.object_mapping:RKMapperOperation.m:300 Found mappable data at keyPath 'Provision.FileInfoWrapper': {
    FileName =     {
        text = "SomeFile.zip";
    };
    FileSha1 =     {
        text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE=";
    };
    …
}
D restkit.object_mapping:RKMapperOperation.m:231 Asked to map source object {
    FileName =     {
        text = "SomeFile.zip";
    };
    FileSha1 =     {
        text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE=";
    };
    …
} with mapping <RKObjectMapping:0x10025e6b0 objectClass=FileInfoWrapper propertyMappings=(
    "<RKAttributeMapping: 0x10025ebc0 FileSha1 => fileSha1>",
    "<RKAttributeMapping: 0x10025ed90 FileName => fileName>"
    …
)>
D restkit.object_mapping:RKMappingOperation.m:952 Starting mapping operation...
T restkit.object_mapping:RKMappingOperation.m:953 Performing mapping operation: <RKMappingOperation 0x10068f730> for 'FileInfoWrapper' object. Mapping values from object {
    FileName =     {
        text = "SomeFile.zip";
    };
    FileSha1 =     {
        text = "oi7NK/rFLL6dXqcu7ahaNfKsGkE=";
    };
    …
} to object <FileInfoWrapper: 0x10068f290> with object mapping (null)
T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'FileUrl' to 'fileUrl'
T restkit.object_mapping:RKMappingOperation.m:431 Found transformable value at keyPath 'FileUrl'. Transforming from type '__NSDictionaryM' to 'NSString'
D restkit.object_mapping:RKPropertyInspector.m:130 Cached property inspection for Class 'FileInfoWrapper': {
    fileName =     {
        isPrimitive = 0;
        keyValueCodingClass = NSString;
        name = fileName;
    };
    fileSha1 =     {
        isPrimitive = 0;
        keyValueCodingClass = NSString;
        name = fileSha1;
    };
    …
}
T restkit.object_mapping:RKMappingOperation.m:583 Skipped mapping of attribute value from keyPath 'FileUrl to keyPath 'fileUrl' -- value is unchanged ((null))
T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'FileSha1' to 'fileSha1'
T restkit.object_mapping:RKMappingOperation.m:431 Found transformable value at keyPath 'FileSha1'. Transforming from type '__NSDictionaryM' to 'NSString'
T restkit.object_mapping:RKMappingOperation.m:583 Skipped mapping of attribute value from keyPath 'FileSha1 to keyPath 'fileSha1' -- value is unchanged ((null))
…
4

2 に答える 2

3

テキストノードからマッピングする必要があるようです。この投稿には同じ問題がありました:

RestKit 0.20-pre3 と RKXMLReaderSerialization および XMLReader

マッピングを次のように変更します。

[fileInfoMapping addAttributeMappingsFromDictionary:@{
 @"FileUrl.text":        @"fileUrl",
 @"FileName.text":       @"fileName",
 @"FileSha1.text":       @"fileSha1",
 @"FileSize.text":       @"fileSize",
 @"Version.text":        @"version",
 @"Vital.text":          @"vital",}];

それをやった。

于 2013-07-22T00:51:27.737 に答える
2

XML が必要な場合は、accept ヘッダーを JSON に設定しないでください。また、そのようなカンマ区切りのリストを設定できるとは思いません(ただし、100%確実ではありません)。サーバーが Accept ヘッダーの結果として JSON を送信する場合、RestKit は応答に満足しますが、実際にはマッピングに失敗する可能性があります (これは表示されているように見えます)。

トレース ログをオンにして、応答とマッピングに関する詳細情報を取得します。

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

マッピング コードは正しく見えます。

于 2013-07-21T22:58:44.400 に答える