web-dev-qa-db-de.com

Einfache Ziel-C GET-Anfrage

Die meisten Informationen hier beziehen sich auf das aufgegebene ASIHTTPREQUEST-Projekt, also verzeihen Sie mir, dass ich noch einmal gefragt habe.

Tatsächlich muss ich einen Magnetstreifen streichen und die Track-2-Daten an einen Webservice senden, der "angemeldet" oder "nicht registriert" zurückgibt (abhängig vom Status der Karte ...).

Also meine Daten kommen einfach als

NSData *data = [notification object];

Und dann muss ich das an eine URL der Reihenfolge von übergeben

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

Und dann erhalten Sie einfach eine Antwortzeichenfolge ...

Ich habe eine Tonne gesucht und es scheint einige widersprüchliche Antworten zu geben, ob dies einfach mit AFNetworking, RESTkit oder mit den nativen NSURL/NSMutableURLRequest-Protokollen erfolgen soll.

23
Jen Scott

Die Optionen zum Ausführen von HTTP-Anforderungen in Objective-C können ein wenig einschüchternd sein. Eine Lösung, die für mich gut funktioniert hat, ist NSMutableURLRequest. Ein Beispiel (mit ARC, also YMMV) ist:

- (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]; 
}

Update:

Der Titel und das Tagging Ihrer Frage lauten POST, aber Ihre Beispiel-URL würde eine GET-Anfrage anzeigen. Bei einer GET-Anfrage reicht das obige Beispiel aus. Für einen POST würden Sie ihn wie folgt ändern:

- (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 */ 
}
56
Jason Whitehorn

Update für iOS 9: Daher ist [NSURLConnection sendSynchronousRequest] ab iOS 9 veraltet. Gehen Sie wie folgt vor, um eine GET-Anforderung mit NSURLSession ab iOS 9 auszuführen

GET-Anfrage

// 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 Anfrage

// 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];
13
Solidak

100% funktionierend getestet

Nur für Ziel C

-(void)fetchData
{

    NSURLSessionConfiguration *defaultSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultSessionConfiguration];

    // Setup the request with URL
    NSURL *url = [NSURL URLWithString:@"https://test.orgorg.net/ios/getStory.php?"];
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];

    // Convert POST string parameters to data using UTF8 Encoding
    NSString *postParams = @"";
    NSData *postData = [postParams dataUsingEncoding:NSUTF8StringEncoding];

    // Convert POST string parameters to data using UTF8 Encoding
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setHTTPBody:postData];

    // Create dataTask
    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        NSDictionary *results = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        //JSON Parsing....
        NSString *message = results[@"Message"];
        BOOL status = results[@"Status"];
        if (status){
           // Here you go for data....

        }else{
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"App"
                                                                           message:message
                                                                    preferredStyle:UIAlertControllerStyleAlert]; // 1
            UIAlertAction *firstAction = [UIAlertAction actionWithTitle:@"Ok"
                                                                  style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
                                                                      NSLog(@"You pressed button one");
                                                                  }]; // 2


            [alert addAction:firstAction]; // 4

            [self presentViewController:alert animated:YES completion:nil];
        }



    }];

    // Fire the request
    [dataTask resume];
}
1
**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];
}
0
Mukesh