2013-10-04 25 views
9

tôi vẫn đang sử dụng ASIHTTPRequest và tôi đang tìm forword chuyển sang AFNetworking tôi cũng trải qua Raywenderlich Crash Course Nhưng nó không sử dụng AFNetworking 2.0cách tạo yêu cầu Http đơn giản thông qua AFNetworking

Tôi vừa cố gắng bên dưới mẫu được đề cập tại AFNetworking nhưng không hoạt động.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

NSDictionary *parameters = @{@"UserId": @"24",@"ArticleId":@"0"}; 

NSLog(@"%@",parameters); 



[manager POST:@"http://mysite.com/api/User/showArticleList" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
{ 
    NSLog(@"JSON: %@", responseObject); 


}failure:^(AFHTTPRequestOperation *operation, NSError *error) 
{ 
    NSLog(@"Error: %@", error); 
}]; 

hiển thị diện tích gỡ lỗi:

Lỗi miền = NSCocoaErrorDomain Mã = 3840
"Các hoạt động không thể hoàn tất (Cocoa lỗi 3840.)." (JSON văn bản đã không bắt đầu với mảng hoặc đối tượng và tùy chọn cho phép các mảnh vỡ không được đặt.) UserInfo = 0xa0ba580 {NSDebugDescription = JSON văn bản đã không bắt đầu với mảng hoặc đối tượng và tùy chọn cho phép các mảnh vỡ không được thiết lập.}

Nhưng khi tôi sử dụng liên kết đề cập Raywenderlich khóa học sụp đổ

[manager POST:@"http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
{ 
    NSLog(@"JSON: %@", responseObject); 
}failure:^(AFHTTPRequestOperation *operation, NSError *error) 
{ 
    NSLog(@"Error: %@", error); 
}]; 

Nó cho tôi kết quả đầu ra JSON hoàn hảo, tại sao lại như vậy?

+1

Cậu đặt 'setDefaultHeader: @ "Chấp nhận" giá trị: @ "application/json" ' – Larme

+0

Nó được AFNetworking 2.0 trong trường hợp trên setDefaultHeader không thể được đặt. –

Trả lời

7

tôi cuối cùng đã tìm thấy các giải pháp như sau -

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 


    NSDictionary *parameters = @{@"UserId": @"24",@"Name":@"Robin"}; 

    NSLog(@"%@",parameters); 
    parameters = nil; 

    // if you want to sent parameters you can use above code 

    manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

    [manager POST:@"http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 

     NSLog(@"JSON: %@", responseObject); 


    }failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     NSLog(@"Error: %@", error); 
    }]; 

Đối với văn bản/Html + nếu nó không cung cấp đúng JSON Chuỗi bạn có thể loại bỏ nó khỏi chuỗi và chuyển nó sang mảng hoặc từ điển.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

     // if you want to sent parameters you can use above code 
     manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; 
    // header("Content-Type: application/json"); 
    // manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

     manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 


     [manager GET:@"your url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 

      NSLog(@"responseObject %@",responseObject); 

      NSString *jsonString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 

      NSString *newJsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\'" withString:@""]; 

/* 
NSRange range = [jsonString rangeOfString:@"}" options:NSBackwardsSearch]; 
jsonString = [jsonString substringToIndex:range.location + 1]; 
*/ 
      NSData *data = [newJsonString dataUsingEncoding:NSUTF8StringEncoding]; 

      NSError *error; 
      NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 

      NSLog(@"array %@",array); 


      if (!array) { 
       NSLog(@"Parsing JSON failed: %@", error); 
      } 

      /* 
      NSData *newJSONData = [newJsonString dataUsingEncoding:NSUTF8StringEncoding]; 
      NSDictionary* json = [NSJSONSerialization 
      JSONObjectWithData:newJSONData 
      options:NSJSONReadingMutableContainers 
      error:&error]; 
      NSLog(@"json %@",json); 
      */ 

      NSLog(@"responseObject = %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); 


     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

      NSLog(@"%@",[error description]); 

     }]; 

Trong một số trường hợp, bạn cần thay đổi từ điển/mảng phản hồi - nhưng đôi khi tất cả các mảnh của đối tượng không thể thay đổi.
Để thực hiện điều đó, hãy làm như sau.

Đối điển

NSError *error; 

       NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:responce options:NSJSONWritingPrettyPrinted error:&error]; 

       responseDictionary = [[NSMutableDictionary alloc]init]; 

       responseDictionary = [NSJSONSerialization JSONObjectWithData:dataFromDict options:NSJSONReadingMutableContainers error:&error]; 

Đối với mảng

NSError *error; 

       NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:responce options:NSJSONWritingPrettyPrinted error:&error]; 

       responseArray = [[NSMutableDictionary alloc]init]; 

       responseArray = [NSJSONSerialization JSONObjectWithData:dataFromDict options:NSJSONReadingMutableContainers error:&error]; 
3

Dường như bạn có dịch vụ ASP.NET Web API ở phía máy chủ. Nó trả về XML theo mặc định.

Bạn có hai lựa chọn:

  1. Thay đổi cấu hình của dịch vụ web như được giải thích trong How do I get ASP.NET Web API to return JSON instead of XML using Chrome?

  2. Gửi header HTTP Accept: application/json cùng với yêu cầu của bạn.

+0

Tôi không sử dụng api web ASP.NET và thứ hai không có tùy chọn gợi ý mã cho tiêu đề HTTP –

+0

Vì vậy, bạn đang sử dụng gì ở phía máy chủ? Và định dạng nào sẽ trả lại nếu bạn không chỉ định một định dạng bằng cách sử dụng tiêu đề Accept HTTP? – Codo

+0

webservice được thực hiện thông qua PHP-MYSQL và cung cấp dữ liệu ở định dạng JSON –

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