2013年6月23日日曜日

iOSでHTTPリクエストする

比較的単純な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

0 件のコメント:

コメントを投稿