2012-03-29 8 views
8

Krótka fabuła, nasz poprzedni programista użył ASIHTTPRequest, aby wysyłać żądania POST i pobierać dane z naszego serwisu. Z nieznanych przyczyn ta część naszej aplikacji przestała działać. Wydawało się, że jest wystarczająco dobry czas na przyszłe dowody i udać się z AFNetworking. Usługa sieciowa REST działa na strukturze CakePHP.AFNetworking POST to REST webservice

W skrócie nie otrzymuję łańcucha odpowiedzi żądania za pomocą AFNetworking.

wiem, że usługa działa, ponieważ jestem w stanie z powodzeniem dodawać dane i otrzymać właściwą odpowiedź za pomocą curl: curl -d "danych [modelu] [field0] = field0value & danych [model] [pole1] = field1value" https://example.com/api/class/function.plist

Zgodnie z instrukcjami poprzedniego programisty wymyśliłem następujące.

#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]; 

} 

wyjściowa: operacja hasAcceptableStatusCode: 200 odpowiedź ciąg: pusty plik plist

próbowali rozwiązanie 1: AFNetworking Post Request proponowane rozwiązanie wykorzystuje funkcją AFHTTPRequestOperation nazywa operationWithRequest. Jednak, gdy próbuję użyć tego rozwiązania, otrzymuję ostrzeżenie "Metoda klasy" + operacjaWitądanie: zakończenie: "nie znaleziono (typ powrotu domyślnie jest" id ""

próbowano rozwiązania 2: NSURLConnection output: Jestem w stanie wydrukować protokół sukces messaged ale nie ciąg odpowiedź * Update -.. powraca pusty plist

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

Witaj, Pouria, czy próbowałeś użyć NSURLConnection, aby wysłać synchroniczne żądanie? – 8vius

+0

próbowano rozwiązania 2: jak próbowałam NSURLConnection. – Airuop

+0

Czy masz wszystko poprawnie skonfigurowane po stronie serwera? Podobnie jak w przypadku parsowania rozszerzenia, układów odpowiedzi i widoków dla nich? Wygląda raczej na problem z serwerem niż na klienta. – 8vius

Odpowiedz

18

Są to niezbędne (warunki wyłączenia, które zrobiłem dla własnego użytku) linie, które zakończyły się spełniając moją prośbę do usługi internetowej. Dzięki za sugestie @ 8vius i @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

Rejestracja operacji plist dotyczy tylko operacji na żądanie utworzonych przy użyciu 'AFHTTPClient -HTTPRequestOperationWithRequest: success: failure:'. "alloc init" -ing 'AFHTTPRequestOperation' zawsze da ci' AFHTTPRequestOperation'. – mattt

+0

dzięki, @mattt! – Airuop

+0

@pouria, co to jest ścieżka tutaj. Czy to taki sam adres URL. Proszę, pomóż mi, utknąłem w Path. –

6

Korzystając AFHTTPClient -postPath:parameters:success:failure:, przekazując swoje parametry (zagnieżdżone słowniki/tablice są w porządku) Jeśli spodziewasz się plist powrotem. , pamiętaj, aby zarejestrować klienta: AFPropertyListRequestOperation.

W każdym przypadku, setValue:forHTTPHeaderField: nie jest tym, czego potrzebujesz. HTTP headers służą do określania informacji o samym żądaniu; dane są częścią treści żądania. AFHTTPClient automatycznie konwertuje parametry na ciąg zapytania dla żądań GET lub treść HTTP dla POST, et al.

+0

Rozwiązałem tę kwestię, ale mam wrażenie, że nadal robię coś złego lub nieefektywnie. Byłbym bardzo wdzięczny, gdybyś rzucił okiem na moje rozwiązanie. Dzięki! – Airuop