首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS RestKit 解析純文本響應:非 JSON/XML/HTML 場景處理

     編輯:程式設計綜合問答

場景

服務器返回純文本數字(如 19),非標準 JSON/XML/HTML 格式。需用 RestKit 解析並獲取字串。

最簡方案:繞過 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];

若必須用 RestKit:自定義 Response Descriptor

// 定義映射:將純文本映射到 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,輕量高效
  • 需統一錯誤處理/認證/緩存:AFNetworking / Alamofire 封裝工具類
  • 複雜結構化數據:RestKit / ObjectMapper / Codable (Swift)
  • 不要為了用框架而用框架:選擇最適合響應格式的工具
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved