服務器返回純文本數字(如 19),非標準 JSON/XML/HTML 格式。需用 RestKit 解析並獲取字串。
對於非結構化響應,RestKit 映射機制反而增加複雜度。建議直接使用 NSURLSession 或 AFNetworking:
// 同步(僅後台執行緒)
NSString *urlString = @"https://api.example.com/getNumber";
NSURL *url = [NSURL URLWithString:urlString];
NSError *error = nil;
NSString *result = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding
error:&error];
if (!error) {
NSLog(@"純文本結果: %@", result); // 輸出: 19
// 進一步轉換
int number = [result intValue];
} else {
NSLog(@"請求失敗: %@", error.localizedDescription);
}
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error && data) {
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
// UI 更新
self.label.text = result;
});
}
}];
[task resume];
// 定義映射:將純文本映射到 NSString 屬性
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"PlainText"
inManagedObjectStore:store];
[mapping addAttributeMappingsFromDictionary:@{@"": @"textValue"}]; // 空鍵映射整個響應體
RKResponseDescriptor *descriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
method:RKRequestMethodGET
pathPattern:@"/getNumber"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
// 註冊
[[RKObjectManager sharedManager] addResponseDescriptor:descriptor];
// 請求
[[RKObjectManager sharedManager] getObjectsAtPath:@"/getNumber"
parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
PlainText *obj = [mappingResult.firstObject];
NSLog(@"RestKit 解析: %@", obj.textValue);
} failure:nil];
注意:需 Core Data 堆疊支援 Entity Mapping,過重不推薦。
NSURLSession + stringWithContentsOfURL,輕量高效