Простая цель c запросом GET - PullRequest
24 голосов
/ 23 февраля 2012

Большая часть информации здесь относится к заброшенному проекту ASIHTTPREQUEST, так что извините за повторный запрос.

По сути, мне нужно провести по магнитной полосе и отправить данные дорожки 2 на веб-сервис, который возвращает «зарегистрировано»или "notenrolled" (в зависимости от состояния карты ...)

Таким образом, мои данные поступают просто как

NSData *data = [notification object];

И затем мне нужно передать это URL-адресу впорядка

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

А затем просто получите строку ответа ...

Я искал тонну, и, кажется, есть некоторые противоречивые ответы относительно того,это должно быть выполнено просто с помощью AFNetworking, RESTkit или с помощью собственных протоколов NSURL / NSMutableURLRequest.

Ответы [ 3 ]

60 голосов
/ 23 февраля 2012

Варианты выполнения HTTP-запросов в Objective-C могут быть немного пугающими. Одно из решений, которое мне пригодилось, - использовать NSMutableURLRequest Пример (с использованием ARC, поэтому YMMV):

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

Обновление:

Заголовок вашего вопроса и пометка говорят POST, но ваш пример URL будет указывать на запрос GET. В случае запроса GET приведенного выше примера достаточно. Для POST вы должны изменить его следующим образом:

- (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 */ 
}
14 голосов
/ 08 марта 2017

Обновление для iOS 9: Итак, [NSURLConnection sendSynchronousRequest] не рекомендуется, начиная с iOS 9. Вот как выполнить запрос GET, используя NSURLSession, начиная с iOS 9

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-запрос

// 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 голосов
/ 05 октября 2017
**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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...