2012-02-22 40 views
17

Hầu hết thông tin ở đây đề cập đến dự án ASIHTTPREQUEST bị bỏ rơi để tha thứ cho tôi vì đã hỏi lại.Mục tiêu đơn giản-c Yêu cầu GET

có hiệu quả, tôi cần phải swipe một dải từ và gửi track 2 dữ liệu đến một webservice trả về "đăng ký" hoặc "notenrolled" (tùy thuộc vào tình trạng của thẻ ...)

Vì vậy, dữ liệu của tôi do thỏa thuận hợp đơn giản là

NSData *data = [notification object]; 

Và sau đó tôi cần phải vượt qua này cho một người url trình tự của

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

Và sau đó chỉ cần r đánh dấu chuỗi phản hồi ...

Tôi đã tìm kiếm một tấn và có một số câu trả lời xung đột về việc liệu điều này có nên được thực hiện đơn giản bằng AFNetworking, RESTkit hoặc với giao thức NSURL/NSMutableURLRequest gốc hay không.

Trả lời

51

Các tùy chọn để thực hiện các yêu cầu HTTP trong Mục tiêu-C có thể hơi đáng sợ. Một giải pháp đã làm việc tốt cho tôi là sử dụng NSMutableURLRequest. Một ví dụ (sử dụng ARC, do đó, YMMV) là:

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

Cập nhật: Tiêu đề

của Câu hỏi của bạn, và gắn thẻ nói POST, nhưng URL ví dụ của bạn sẽ chỉ ra một yêu cầu GET. Trong trường hợp yêu cầu GET, ví dụ trên là đủ. Đối với một POST, bạn muốn thay đổi nó như sau:

- (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

OK, cảm ơn vì phản hồi nhanh. Tôi là một chút bối rối như thế nào chính xác này đi qua bất kỳ dữ liệu? Có vẻ như một hàm chỉ đơn giản là kết nối với một dịch vụ http? –

+1

Mẫu POST truyền dữ liệu qua dòng '[request setHTTPBody: body]' và đến trong phần thân HTTP. Ví dụ GET sẽ chuyển dữ liệu trên URL, vì vậy bạn phải định dạng URL của mình trước ... có thể sử dụng '[NSString stringWithFormat: @" http://example.com?param1=%@¶m2=%@ ", param1, param2]'. –

+0

Vì vậy, điều này sẽ trả về "

Đã đăng ký" với NSLOG giống với nguồn trang. Trang thực tế được xuất ra Đã đăng ký mặc dù. Tôi cho rằng đó là một sự khác biệt tầm thường theo nghĩa là tôi có thể phân tích cú pháp mọi thứ khác, nhưng mã này có trả về dữ liệu trang chứ không phải là đầu ra thích hợp không? –

8

Cập nhật dành cho iOS 9: Vì vậy, [NSURLConnection sendSynchronousRequest] bị phản đối bắt đầu từ iOS 9. Dưới đây là cách thực hiện một yêu cầu GET sử dụng NSURLSession bắt đầu từ iOS 9

GET Yêu cầu

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

// 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]; 
} 
Các vấn đề liên quan