2012-12-19 4 views
5

Próbuję uzyskać komunikat POST działa. Widziałem kilka postów opisujących ten proces, na przykład this one, ale nadal nie mogę go uruchomić. Poniżej jest mój kod objective-c:Nie można uzyskać postu HTTP iOS do pracy przy użyciu NSURLConnection

NSString * urlString = @"http://magicthegatheringdatabase.com/test.php"; 
NSURL *aUrl = [NSURL URLWithString: urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl 
                 cachePolicy:NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:60.0]; 

NSString *postString = [NSString stringWithFormat:@"tes1=%@&test2=%@", 
         [@"hello" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
         [@"world" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
NSData * postBody = [postString dataUsingEncoding:NSUTF8StringEncoding]; 
[request setHTTPBody: postBody]; 

[request addValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 

NSString *postLength = [NSString stringWithFormat:@"%d", postBody.length]; 
[request addValue: postLength forHTTPHeaderField:@"Content-Length"]; 

[request setHTTPMethod:@"POST"]; 

NSError * error = nil; 
NSData *returnData = [NSURLConnection sendSynchronousRequest: request 
              returningResponse: nil 
                 error: &error]; 
NSLog(@"%p, %@", error, error.localizedDescription); 

NSString * returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
NSLog(@"Result: %@", returnString); 

I tu jest moje PHP:

<?php 
    print_r($_REQUEST); 
    print_r($_POST); 
    print_r($_GET); 

    echo file_get_contents('php://input'); 
?> 

Jeśli uruchomić kod, pojawia się następujący zalogowany:

 
2012-12-19 09:24:09.061 MTG Deck Builder[7921:570f] 0x0, (null) 
2012-12-19 09:24:09.062 MTG Deck Builder[7921:570f] Result: Array 
(
) 
Array 
(
) 
Array 
(
) 

Gdybym nawigacja bezpośrednio na adres URL i dołącz ?test1=hello&test2=world (używając GET oczywiście zamiast POST) Otrzymuję:

 
Array 
(
    [test1] => hello 
    [test2] => world 
    [phpbb3_5e63r_u] => 1 
    [phpbb3_5e63r_k] => 
    [phpbb3_5e63r_sid] => 7ff37e188aa8e0ab57fae6a52f0d1f7b 
    [__utma] => 86369156.392372889.1349352986.1352901458.1353328580.11 
    [__utmz] => 86369156.1351935106.8.2.utmcsr=hankinsoft.com|utmccn=(referral)|utmcmd=referral|utmcct=/website/forum/10-mtg-magic-the-gathering-trading-card-game-tcg-da/634-new-forum.html 
    [style_cookie] => null 
) 
Array 
(
) 
Array 
(
    [test1] => hello 
    [test2] => world 
) 

Wiem więc, że mój PHP loguje poprawnie pobieranie/żądania, ale nie jestem pewien, dlaczego mój POST przez kod celu-c nie działa. Jestem prawie pewien, że przeoczyłem coś głupiego. Wszelkie sugestie dotyczące tego, czego mi brakuje?

+2

Spróbuj, ustawiając typ i rozmiar zawartości. –

+0

Wykonaj jeszcze jedną rzecz zamiast ustawić zero na błąd, przeprowadź niektóre wystąpienie NSError, abyś mógł się dowiedzieć, jaki błąd nadchodzi. Mam nadzieję, że posortuje twój problem. –

+0

Btw, chcesz usłyszeć o [RestKit] (https://github.com/RestKit/RestKit). – moonwave99

Odpowiedz

3

To dlatego NSURLConnection nie prawidłowo obsługiwać przekierowań.

Po wysłaniu POST żądanie do adresu URL http://magicthegatheringdatabase.com/test.php, serwer odpowie 301 Moved Permanently i przekierowuje do http://www.magicthegatheringdatabase.com/test.php.

Zamiast wysyłać to samo żądanie pod nowy adres URL, NSURLConnection tworzy nowe żądanie GET i odrzuca oryginalne żądanie: HTTPBody. To zachowanie jest spowodowane tym, że HTTP specifications zabrania automatycznego przekierowywania żądań innych niż HEAD i GET bez potwierdzenia ze strony użytkownika. Zmiana metody na GET jest błędna, ale przynajmniej jest bezpieczną metodą, która nie może uszkodzić zasobu HTTP.

Problem ten może być rozwiązany z dwóch opcji:

  1. może po prostu zmienić adres URL żądania być http://www.magicthegatheringdatabase.com/test.php.

  2. Albo można utworzyć instancję NSURLConnection z delegatem i wdrożenie connection:willSendRequest:redirectResponse: w celu obsługi przekierowanie prawidłowo jak opisano w odpowiedzi na this question. To zadziała, nawet jeśli zmiana przekierowania ulegnie zmianie, ale wymaga napisania więcej kodu, gdy trzeba poczekać na odpowiedź, utworzyć obiekt NSMutableData, dołączyć bajty w miarę ich asynchronicznego przetwarzania (patrz Apple Developer Documentation). Jednak wykonywanie zadań asynchronicznie jest zawsze dobrym pomysłem: możesz je anulować w razie potrzeby i nie ryzykujesz zablokowania swojego wątku przez długi czas (gdy jesteś w głównym wątku, wszystko powyżej 1 sekundy to długi czas).

+0

Dzięki za odpowiedź i szczegóły. Wiedziałem, że muszę przeoczyć coś prostego i to się stało. – Kyle

1

Zmiana:

NSString *postString = [NSString stringWithFormat:@"tes1=%@&test2=%@", 
          [@"hello" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
          [@"world" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

Teraz dodaj

[request setHTTPMethod:@"POST"]; 
2

Należy spróbować dodać następujące:

[request addValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

Powiązane problemy