2012-02-22 4 views
17

여기에있는 대부분의 정보는 버려진 ASIHTTPREQUEST 프로젝트를 참조하므로 다시 묻기를 용서합니다.간단한 목표 -c GET 요청

효과적으로, 나는 그래서

내 데이터 (... 카드의 상태에 따라) 자기 띠를 슬쩍하고 "등록"또는 "notenrolled"반환하는 웹 서비스에 트랙 2 개 데이터를 보낼 필요 단순히

NSData *data = [notification object]; 

에서 온다 그리고 난 그냥 R 다음

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

의 순서에 URL이 합격 할 필요가 응답 문자열을 기다리는 중 ...

나는 AFNetworking, RESTkit 또는 네이티브 NSURL/NSMutableURLRequest 프로토콜을 사용하여이 작업을 수행해야하는지에 대해 몇 가지 충돌하는 답변이있는 것으로 보입니다.

답변

51

Objective-C에서 HTTP 요청을 수행하는 옵션은 약간 위협적 일 수 있습니다. 나를 위해 잘 작동 한 한 가지 해결책은 NSMutableURLRequest을 사용하는 것입니다.

- (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 요청을 나타냅니다 (YMMV 그래서, ARC를 사용) 예입니다. 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 */ 
} 
+0

빠른 응답을 보내 주셔서 감사합니다. 이 데이터를 정확히 전달하는 방법에 대해 다소 혼란 스럽습니다. 단순히 http 서비스에 연결하는 기능처럼 보이십니까? –

+1

POST 샘플은'[setHTTPBody : body]'요청을 통해 데이터를 전달하고 HTTP 본문에 도착합니다. GET 예제는 URL에 데이터를 전달하므로 사전에 URL 형식을 지정해야합니다. 아마도 [[NSString stringWithFormat : @ "http://example.com?param1=%@¶m2=%@ ", param1, param2]'. –

+0

따라서 페이지 소스와 동일한 NSLOG에 "

등록 된"이 반환됩니다. 실제 페이지가 등록되어 출력됩니다. 나는 다른 모든 것을 파싱 할 수 있다는 의미에서 사소한 차이가 있다고 가정하지만이 코드는 올바른 결과가 아닌 페이지 데이터를 반환하고 있습니까? –

8

업데이트를 아이폰 OS 9 : 그래서, [NSURLConnection sendSynchronousRequest]는 아이폰 OS 9에서 시작되지 않습니다 여기에 아이폰 OS 9

부터 NSURLSession을 사용하여 GET 요청을하는 방법

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