2012-03-23 59 views
14

Tôi đã sử dụng nhiều giờ để giải quyết vấn đề này. Tôi đang sử dụng Restkit 0.9.3 với Object Mapping 2.0. Tất cả dữ liệu đều bằng JSON. Tôi có thể thực hiện các hoạt động GET, POST, PUT và DELETE một cách chính xác, đó là nội dung phản hồi mà tôi không nắm bắt và ánh xạ một cách chính xác ..Khôi phục thông báo lỗi json khôi phục từ máy chủ

Vì vậy, vấn đề của tôi là lỗi khôi phục khi lỗi xảy ra. Tôi muốn để lập bản đồ những lỗi với restkit, fx lỗi này sẽ được trả về:

{ "code": "401", "message": "Không phận sự" }

Làm thế nào để lập bản đồ json này đúng không? Tôi đã thử rất nhiều thứ và có thể sử dụng một số hướng dẫn - hoặc vui lòng cho ví dụ về điều này.

Trả lời

10

Đối với phiên bản 0.10.0 lỗi phản ứng này có thể được ánh xạ như sau:

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]]; 
[errorMapping mapKeyPath:@"message" toAttribute:@"errorMessage"]; 
[[[RKObjectManager sharedManager] mappingProvider] setErrorMapping:errorMapping]; 

Các yêu cầu trả lại một lỗi sẽ gọi phương thức đại biểu sau đây:

- (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error { 
    NSArray *errorMessages = [[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey]; 
    RKErrorMessage *errorMessage = [errorMessages objectAtIndex:0]; // First and only object in your case. 
    NSString *message = [errorMessage errorMessage]; 
    NSInteger code = [[objectLoader response] statusCode]; 
    NSLog(@"ERROR: [%d] %@", code, message); // => ERROR: [401] Unauthorized 
} 
+0

setErrorMapping thực hiện mẹo này, cảm ơn –

+1

Bất kỳ ý tưởng nào về cách thực hiện điều này trong câu 20.? – dirkoneill

+0

Chưa hoạt động với phiên bản v.20. – fphilipe

0

nếu một đối tượng được trả về đại biểu của bạn nên gọi phương pháp này:

trong phương pháp này, bạn nên gọi một thể hiện của lớp "lỗi" của bạn và bản đồ 'mã' và 'thông điệp' khi cần thiết.

Một cách dễ dàng hơn để xử lý các lỗi mặc dù sẽ được sử dụng:

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error { 

if(objectLoader.response.statusCode == 401) 
{ ... 

Và hiển thị các thông báo lỗi cần thiết trong phương pháp đó.

29

Đối RestKit v0.20

giả sử thân HTTP của bạn là:

{"error": "..."} 

bạn tạo các bản đồ và mô tả:

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]]; 

[errorMapping addPropertyMapping: [RKAttributeMapping attributeMappingFromKeyPath:@"error" toKeyPath:@"errorMessage"]]; 
RKResponseDescriptor *errorResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)]; 
[objectManager addResponseDescriptor:errorResponseDescriptor]; 

và sau đó bạn có thể truy cập nó từ khối thất bại của bạn:

failure:^(RKObjectRequestOperation *operation, NSError *error) { 
       NSLog(@"errorMessage: %@", [[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey]); 
      } 

này sử dụng được xây dựng trong RKErrorMessage lớp, mặc dù bạn có thể tạo lớp tùy chỉnh của riêng bạn với các trường bổ sung.

+0

Người đàn ông, bạn thật tuyệt vời !!! – AlexDenisov

+0

Điều này không hoạt động. Lỗi trả về lỗi. NSLOG hiển thị errorMessage: (null) http://stackoverflow.com/questions/19736408/restkit-failure-getting-access-to-the-json-returned – jdog

+1

Làm việc tốt cho tôi và những người khác. Bạn có đang sử dụng ánh xạ chính xác cho lớp của mình không? – Brenden

5

Sử dụng Bộ nhớ cache v0.2x bạn có thể bản đồ tất cả JSON thuộc tính bạn muốn đến đã tồn tại RKErrorMessage.userInfo tài sản từ điển trong này [Swift] cách:

let errorMapping = RKObjectMapping(forClass: RKErrorMessage.self); 
errorMapping.addPropertyMapping(RKAttributeMapping(fromKeyPath: nil, toKeyPath: "userInfo")); 

let errorResponseDescriptor = RKResponseDescriptor(
    mapping: errorMapping, 
    method: RKRequestMethod.Any, 
    pathPattern: nil, 
    keyPath: "error", //or nil, according to your json response 
    statusCodes: RKStatusCodeIndexSetForClass(UInt(RKStatusCodeClassClientError))) 
); 

Vì vậy, bạn có thể ánh xạ một lỗi JSON phản ứng như thế này:

{ 
    "error": { 
     "message": "Error message", 
     "cause": "...", 
     "code": "my_error_code", 
     "url": "..." 
     ... 
    } 
} 

Và lấy RKErrorMessage với tất cả các thuộc tính, trong một đóng failure, như sau:

failure: { (operation, error) -> Void in 
    if let errorMessage = error.userInfo?[RKObjectMapperErrorObjectsKey]?.firstObject as? RKErrorMessage{ 
     let message = errorMessage.userInfo["message"] as! String; 
     let code = errorMessage.userInfo["code"] as! String; 
     ... 
    } 
} 

Tôi hy vọng điều này có thể hữu ích cho ai đó!

+0

Thay vì 'statusCodes: RKStatusCodeIndexSetForClass (UInt (RKStatusCodeClassClientError))' bạn cũng có thể sử dụng 'statusCodes: RKStatusCodeIndexSetForClass (.ClientError)' – anka

Các vấn đề liên quan