Простой objective-c запрос GET
Большая часть информации здесь относится к заброшенному проекту ASIHTTPREQUEST, поэтому простите меня за повторный запрос.
Фактически, мне нужно провести магнитную полосу и отправить данные трека 2 в веб-сервис, который возвращает "зарегистрированный" или "notenrolled" (в зависимости от состояния карты...)
Итак, мои данные поступают просто как
NSData *data = [notification object];
И тогда мне нужно передать это URL-адрес в порядок
http://example.com/CardSwipe.cfc?method=isenrolled&track2=data
А затем просто получите строку ответа...
Я обыскал тонну, и, похоже, есть некоторые противоречивые ответы относительно того, следует ли это делать просто с помощью AFNetworking, RESTkit или с собственными протоколами NSURL/NSMutableURLRequest.
Ответы
Ответ 1
Параметры для выполнения 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];
}
Update:
Заголовок вопроса и пометка говорят 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 */
}
Ответ 2
Обновление для 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];
Ответ 3
**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];
}