比較的単純なHTTPリクエストを実行する際は、非同期リクエストであるNSURLConnectionクラスのsendAsynchronousRequest:queue:completionHandler:クラスメソッドを利用する。
本APIはiOS5.0から利用可能。
第3引数completionHandlerにはデータ取得時に実行するBlock文を記述する。このBlock文は第2引数queueで指定したNSOperationQueue上で実行される。以下のコード例ではBlock文はメインスレッドで実行されることになる。
環境
- Xcode 4.6.3
- ARC ON
- iPhone 6.1 Simulator
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *requestUrl;
@property (weak, nonatomic) IBOutlet UITextField *requestBody;
@property (weak, nonatomic) IBOutlet UITextView *requestResult;
- (IBAction)getAsync:(id)sender;
- (IBAction)postAsync:(id)sender;
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// HTTP-GET
- (IBAction)getAsync:(id)sender {
NSLog(@"%@#%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
// Create the url-request.
NSURL *url = [NSURL URLWithString:self.requestUrl.text];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// Set the method(HTTP-GET)
[request setHTTPMethod:@"GET"];
// Send the url-request.
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (data) {
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"result: %@", result);
self.requestResult.text = result;
} else {
NSLog(@"error: %@", error);
self.requestResult.text = [NSString stringWithFormat:@"error: %@", error];
}
}];
}
// HTTP-POST
- (IBAction)postAsync:(id)sender {
NSLog(@"%@#%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
// Create the url-request.
NSURL *url = [NSURL URLWithString:self.requestUrl.text];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// Set the header(s).
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// Set the method(HTTP-POST)
[request setHTTPMethod:@"POST"];
// Set the request-body.
NSString *reqBody = self.requestBody.text;
NSLog(@"reqBody: %@", reqBody);
[request setHTTPBody:[reqBody dataUsingEncoding:NSUTF8StringEncoding]];
// Send the url-request.
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (data) {
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"result: %@", result);
self.requestResult.text = result;
} else {
NSLog(@"error: %@", error);
self.requestResult.text = [NSString stringWithFormat:@"error: %@", error];
}
}];
}
@end