2012-02-22 13 views
17

Większość informacji tutaj odnosi się do porzuconego projektu ASIHTTPREQUEST, więc wybacz mi, proszę o jeszcze raz.Prosty cel-C Żądanie GET

Skutecznie, muszę przesunąć pasek magnetyczny i wysłać track 2 danych do usługa, która zwraca „naukę” lub „notenrolled” (w zależności od stanu karty ...)

więc moje dane przychodzi po prostu jako

NSData *data = [notification object]; 

I wtedy trzeba przekazać to na URL do porządku

http://example.com/CardSwipe.cfc?method=isenrolled&track2=data

a potem po prostu r eceive odpowiedź ciąg ...

Szukałem tony i wydaje się, że niektóre sprzeczne odpowiedzi, czy należy to osiągnąć po prostu z AFNetworking, RESTkit lub z natywnymi NSURL/NSMutableURLRequest protokołów.

Odpowiedz

51

Możliwości wykonywania żądań HTTP w Objective-C mogą być trochę zastraszające. Jednym z rozwiązań, który zadziałał dobrze, jest użycie NSMutableURLRequest. Przykładem (za pomocą łuku, tak YMMV) wynosi:

- (NSString *) getDataFrom:(NSString *)url{ 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setHTTPMethod:@"GET"]; 
    [request setURL:[NSURL URLWithString:url]]; 

    NSError *error = nil; 
    NSHTTPURLResponse *responseCode = nil; 

    NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]; 

    if([responseCode statusCode] != 200){ 
     NSLog(@"Error getting %@, HTTP status code %i", url, [responseCode statusCode]); 
     return nil; 
    } 

    return [[NSString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding]; 
} 

Aktualizacja: tytuł

swoje pytanie, a tagowanie powiedzieć POST, ale Twój przykład URL wskazywałoby na żądanie GET. W przypadku żądania GET powyższy przykład jest wystarczający. Na stanowisko pracy, można ją zmienić w następujący sposób:

- (NSString *) getDataFrom:(NSString *)url withBody:(NSData *)body{ 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:body]; 
    [request setValue:[NSString stringWithFormat:@"%d", [body length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setURL:[NSURL URLWithString:url]]; 

    /* the same as above from here out */ 
} 
+0

Dobra dzięki za szybką odpowiedź. Jestem trochę zdezorientowany, jak dokładnie to przekazywanie jakichkolwiek danych? Wygląda na to, że po prostu łączysz się z usługą http? –

+1

Próbka POST przekazuje dane przez linię '[request setHTTPBody: body]' i przybywa do treści HTTP. Przykład GET przekazałby dane na adres URL, więc musisz sformatować swój adres URL z wyprzedzeniem ... może używając '[NSString stringWithFormat: @" http://example.com?param1=%@¶m2=%@ ", param1, param2]'. –

+0

Więc to jest powrót "

rejestrują" do NSLog, która jest taka sama jak w źródle strony. Rzeczywista strona jest jednak rejestrowana. Przypuszczam, że jest to trywialna różnica w tym sensie, że mogę analizować wszystko inne, ale czy ten kod zwraca dane strony, a nie dane wyjściowe? –

8

Aktualizacja dla systemu iOS 9: Więc [NSURLConnection sendSynchronousRequest] jest przestarzała począwszy od iOS 9. Oto jak to zrobić za pomocą żądania GET NSURLSession począwszy od iOS 9

żądanie GET

// making a GET request to /init 
NSString *targetUrl = [NSString stringWithFormat:@"%@/init", baseUrl]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setHTTPMethod:@"GET"]; 
[request setURL:[NSURL URLWithString:targetUrl]]; 

[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler: 
    ^(NSData * _Nullable data, 
    NSURLResponse * _Nullable response, 
    NSError * _Nullable error) { 

     NSString *myString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     NSLog(@"Data received: %@", myString); 
}] resume]; 

POST Zapytanie

// making a POST request to /init 
NSString *targetUrl = [NSString stringWithFormat:@"%@/init", baseUrl]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

//Make an NSDictionary that would be converted to an NSData object sent over as JSON with the request body 
NSDictionary *tmp = [[NSDictionary alloc] initWithObjectsAndKeys: 
        @"basic_attribution", @"scenario_type", 
        nil]; 
NSError *error; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:tmp options:0 error:&error]; 

[request setHTTPBody:postData]; 
[request setHTTPMethod:@"POST"]; 
[request setURL:[NSURL URLWithString:targetUrl]]; 

[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler: 
    ^(NSData * _Nullable data, 
    NSURLResponse * _Nullable response, 
    NSError * _Nullable error) { 

     NSString *responseStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     NSLog(@"Data received: %@", responseStr); 
}] resume]; 
0
**Simply Call and get your JSON Data.** 

-(void)getJSONData 
{ 

NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/us/rss/topaudiobooks/limit=10/json"]; 

NSURLSession *session = [NSURLSession sharedSession]; 

NSURLSessionDataTask *data = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 

    NSError *erro = nil; 

    if (data!=nil) { 

     NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&erro ]; 

     if (json.count > 0) { 

      for(int i = 0; i<10 ; i++){ 

       [arr addObject:[[[json[@"feed"][@"entry"] objectAtIndex:i]valueForKeyPath:@"im:image"] objectAtIndex:0][@"label"]]; 
      } 

     } 
    } 
    dispatch_sync(dispatch_get_main_queue(),^{ 

     [table reloadData]; 
    }); 
}]; 

[data resume]; 
} 
Powiązane problemy