2013-11-09 16 views
6

Tôi đang cố gắng gọi api.php trên máy chủ cục bộ của mình (sử dụng MAMP). Các api.php phía máy chủ được gọi nhưng nội dung của _POST bên trong mã php chứa các lỗi sau:AFNetworking 2.0 POST issue, Cocoa cocoa 3840 (văn bản JSON không bắt đầu bằng mảng ...)

Error Domain = NSCocoaErrorDomain Code = 3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo = 0x15d7bdd0 {NSDebugDescription = JSON text did not start with array or object and option to allow fragments not set.} 

Ứng dụng của tôi đang cố gắng để gửi yêu cầu JSON POST đến api.php là một iOS ứng dụng sử dụng AFNetworking 2

Đây là mã yêu cầu của tôi:

- (void)postUpdateRequest 
{ 
    if (!dataModel) 
     dataModel = [[DataModel alloc] init]; 

    NSDictionary *params = @{@"foo": @"bar2"}; 

    NSLog(@"%@",params); 

/* NSDictionary *params = @{@"cmd":@"update", 
          @"user_id":[dataModel userId], 
          @"token":[dataModel deviceToken] 
          };//@"ip_address":[dataModel getIPAddress]};*/ 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
// manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

    [manager POST:ServerApiURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
} 

tôi nhìn khắp nơi trên internet nhưng không thể tìm thấy câu trả lời cho vấn đề cụ thể của tôi. Không có vấn đề gì tôi làm tôi nhận được cùng một lỗi trở lại.

Tại sao JSON của tôi không được định dạng đúng? Tôi cũng không thể tìm cách để đánh hơi những gì JSON tôi thực sự gửi.

Cảm ơn bạn.

+0

1) Điều gì làm cho bạn chắc chắn bạn gửi dữ liệu JSON? (thực sự, bạn không). 2) Bạn mong đợi máy chủ trả về cái gì? (có lẽ không phải những gì bạn mong đợi) 3) Đâu là dòng mã gây ra lỗi? – CouchDeveloper

Trả lời

5

Khi bạn sử dụng API như trong ví dụ của mình, thông báo HTTP của bạn sẽ được soạn thảo bằng cách sử dụng Content-Type application/x-www-form-urlencoded. Trong nội bộ, từ điển param của bạn được mã hóa bởi AFN (mặc dù không đúng theo quy định của w3c) và được đặt làm cơ quan yêu cầu.

Vì bạn không chỉ định tiêu đề Accept, máy chủ được tự do chọn loại nội dung cho dữ liệu phản hồi có thể (nếu có).

Khi nhận được phản hồi, bạn cần luôn luôn kiểm tra mã trạng thái HTTP và loại nội dung của nội dung phản hồi (nếu có).

Có thể máy chủ trả lại mã trạng thái cho biết một số vấn đề và nội dung phản hồi chứa "phản hồi lỗi" ở một số loại nội dung khác với bạn mong đợi (ví dụ: trả về văn bản/html).

+0

Vấn đề là tôi đã thực sự cố gắng đặt _POST trong thông báo lỗi nhưng nó chỉ phàn nàn về định dạng lỗi, tôi nghĩ vậy. Tôi đã làm một cái gì đó như exitWithError (400, $ _POST); Tôi lầm tưởng rằng tôi đang in nội dung _POST. – user1097185

2

Bạn có thể sử dụng smth như wireshark (http://www.wireshark.org/) trong khi chạy ứng dụng trong trình mô phỏng hoặc trên thiết bị được kết nối qua wifi được chia sẻ với mac bạn đang chạy whireshark để theo dõi các yêu cầu và phản hồi thực tế.

2

này làm việc cho tôi:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer]; 

[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    manager.requestSerializer = requestSerializer; 

[manager POST:URLString 
     parameters:params 
      success:^(AFHTTPRequestOperation *operation, id responseObject) { 
       NSLog(@"JSON: %@", responseObject); 
       [MBProgressHUD hideAllHUDsForView:self.view animated:YES]; 
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       NSLog(@"Error: %@", error); 
       [MBProgressHUD hideAllHUDsForView:self.view animated:YES]; 
      }]; 
Các vấn đề liên quan