2012-03-29 42 views
8

Tóm tắt cốt truyện, nhà phát triển trước đây của chúng tôi đã sử dụng ASIHTTPRequest để thực hiện yêu cầu POST và truy xuất dữ liệu từ dịch vụ web của chúng tôi. Vì lý do không rõ phần này của ứng dụng của chúng tôi đã ngừng hoạt động. Dường như thời gian đủ tốt để chứng minh trong tương lai và đi với AFNetworking. REST webservice chạy trên khung công tác CakePHP.AFNetworking POST tới REST webservice

Tóm lại, tôi không nhận được chuỗi phản hồi yêu cầu bằng cách sử dụng AFNetworking.

Tôi biết webservice hoạt động vì tôi có thể đăng dữ liệu thành công và nhận được phản hồi thích hợp bằng cách sử dụng curl: curl -d "dữ liệu [Model] [field0] = field0value & data [Model] [field1] = field1value" https://example.com/api/class/function.plist

Theo hướng dẫn của nhà phát triển trước, tôi đã đưa ra những điều sau đây.

#import "AFHTTPRequestOperation.h"  

… 

- (IBAction)loginButtonPressed { 

    NSURL *url = [NSURL URLWithString:@"https://example.com/api/class/function.plist"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

    [request setHTTPMethod:@"POST"]; 

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

    [request setValue:[usernameTextField text] forHTTPHeaderField:@"data[User][email]"]; 

    [request setValue:[passwordTextField text] forHTTPHeaderField:@"data[User][password]"]; 

    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

     NSLog(@"operation hasAcceptableStatusCode: %d", [operation.response statusCode]); 

     NSLog(@"response string: %@ ", operation.responseString); 

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

     NSLog(@"error: %@", operation.responseString); 

    }]; 

    [operation start]; 

} 

đầu ra: hoạt động hasAcceptableStatusCode: 200 phản ứng chuỗi: một plist tập tin trống

cố gắng giải pháp 1: AFNetworking Post Request các giải pháp đề xuất sử dụng một chức năng của AFHTTPRequestOperation gọi operationWithRequest. Tuy nhiên, khi tôi cố gắng sử dụng giải pháp đã nói, tôi nhận được cảnh báo "Phương thức lớp '+ operationWithRequest: completion:' không tìm thấy (kiểu trả về mặc định là 'id'"

giải pháp đã thử 2: Kết nối NSURLConnection. in nhật ký thành công nhắn tin cho nhưng không phải là chuỗi phản ứng * cập nhật -.. lợi nhuận plist trống

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; 
NSString *httpBodyData = @"data[User][email][email protected]&data[User][password]=awesomepassword"; 
[httpBodyData dataUsingEncoding:NSUTF8StringEncoding]; 
[req setHTTPMethod:@"POST"]; 
[req setHTTPBody:[NSData dataWithContentsOfFile:httpBodyData]]; 
NSHTTPURLResponse __autoreleasing *response; 
NSError __autoreleasing *error; 
[NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error]; 

// *update - returns blank plist 
NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; 
NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
NSLog(@"responseData %@",str); 

if (error == nil && response.statusCode == 200) { 
    // Process response 
    NSLog(@"success");//returns success code of 200 but blank 
    NSLog(@"resp %@", response); 
} else { 
    // Process error 
    NSLog(@"error"); 
} 
+0

Xin chào, Pouria, bạn đã thử sử dụng NSURLConnection để gửi yêu cầu đồng bộ chưa? – 8vius

+0

giải pháp đã thử 2: là cách tôi đã thử NSURLConnection. – Airuop

+0

Bạn có mọi thứ ở phía máy chủ được thiết lập đúng không? Giống như phân tích cú pháp tiện ích mở rộng, bố cục cho phản hồi và lượt xem cho chúng? Có vẻ như vấn đề máy chủ nhiều hơn so với máy khách. – 8vius

Trả lời

18

Đây là những điều cần thiết (loại bỏ các điều kiện tôi đã thực hiện cho mục đích sử dụng riêng) của tôi, điều này đã đáp ứng yêu cầu của tôi đối với dịch vụ web. Cảm ơn các đề xuất @ 8vius và @mattt!

- (IBAction)loginButtonPressed {   
    NSURL *baseURL = [NSURL URLWithString:@"https://www.example.com/api/class"]; 

    //build normal NSMutableURLRequest objects 
    //make sure to setHTTPMethod to "POST". 
    //from https://github.com/AFNetworking/AFNetworking 
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL]; 
    [httpClient defaultValueForHeader:@"Accept"]; 

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: 
          [usernameTextField text], kUsernameField, 
          [passwordTextField text], kPasswordField, 
          nil]; 

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" 
      path:@"https://www.example.com/api/class/function" parameters:params]; 

    //Add your request object to an AFHTTPRequestOperation 
    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] 
             initWithRequest:request] autorelease]; 

    //"Why don't I get JSON/XML/Property List in my HTTP client callbacks?" 
    //see: https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ 
    //mattt's suggestion http://stackoverflow.com/a/9931815/1004227 - 
    //-still didn't prevent me from receiving plist data 
    //[httpClient registerHTTPOperationClass: 
    //   [AFPropertyListParameterEncoding class]]; 

    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 

    [operation setCompletionBlockWithSuccess: 
     ^(AFHTTPRequestOperation *operation, 
     id responseObject) { 
     NSString *response = [operation responseString]; 
     NSLog(@"response: [%@]",response); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"error: %@", [operation error]); 
    }]; 

    //call start on your request operation 
    [operation start]; 
    [httpClient release]; 
} 
+0

Việc đăng ký các thao tác plist chỉ ảnh hưởng đến các hoạt động yêu cầu được tạo bằng cách sử dụng 'AFHTTPClient -HTTPRequestOperationWithRequest: success: failure:'. 'alloc init'-ing' AFHTTPRequestOperation' luôn cung cấp cho bạn 'AFHTTPRequestOperation'. – mattt

+0

cảm ơn, @mattt! – Airuop

+0

@pouria, Đường dẫn ở đây là gì. Nó giống như một URL tương tự. Xin hãy giúp tôi tôi bị kẹt ở Path. –

6

Sử dụng AFHTTPClient -postPath:parameters:success:failure:, đi qua các thông số của bạn (từ điển lồng/mảng cũng tốt) Nếu bạn đang mong đợi một plist lại. , hãy đảm bảo đăng ký khách hàng AFPropertyListRequestOperation.

Trong mọi trường hợp, setValue:forHTTPHeaderField: không phải là những gì bạn muốn ở đây. HTTP headers là để chỉ định thông tin về chính yêu cầu đó; dữ liệu là một phần của phần thân yêu cầu. AFHTTPClient sẽ tự động chuyển đổi các tham số thành chuỗi truy vấn cho các yêu cầu GET hoặc HTTP cho POST, et al.

+0

Tôi đã giải quyết vấn đề này nhưng tôi có cảm giác tôi vẫn đang làm điều gì đó sai hoặc không hiệu quả. Tôi rất cảm kích nếu bạn có một cái nhìn nhanh về giải pháp của tôi. Cảm ơn! – Airuop

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