본문 바로가기
프로그래밍/iOS

iphone에서 http 사용하기 (get/post) - 소스코드는 퍼왔습니다.

by 백룡화검 2011. 5. 21.
POST로 데이터를 보낼때 NSDictionary를 사용하면 되는데 스타일은
아래의 코드와 같이 실제 값이 앞에 가고 뒤에 이름이 들어간다.

[뷰에 클릭후 http를 생성 및 초기 코드]

// url 문자열을 이용하여 HTTP 웹사이트에 접속

- (void)requestUrl {

    // 접속할 주소 설정

    NSString *url = @"http://사용자의 웹 페이지 주소";

    

    // HTTP Request 인스턴스 생성

    HTTPRequest *httpRequest = [[HTTPRequest alloc] init];

    

    // POST 전송할 데이터 설정

    NSDictionary *bodyObject = [NSDictionary dictionaryWithObjectsAndKeys:

@"38.0", @"latitude"

@"127.0", @"longitude",

nil];

//NSString *bodyObject = @"type=getUser&seq=1&latitude=38.0&longitude=127.0&time=13600&unit='k'&distance=9999";

    

    // 통신 완료 호출할 델리게이트 셀렉터 설정

    [httpRequest setDelegate:self selector:@selector(didReceiveFinished:)];

    

    // 페이지 호출

    [httpRequest requestUrl:url bodyObject:bodyObject];

//

[spinner startAnimating];

}


아래 코드들은 클래스 생성후에 내용을 추가 해야 합니다.
[HTTPRequest.h]

#import <Foundation/Foundation.h>



@interface HTTPRequest : NSObject

{

    NSMutableData *receivedData;

    NSURLResponse *response;

    NSString *result;

    id target;

    SEL selector;

}


- (BOOL)requestUrl:(NSString *)url bodyObject:(NSDictionary *)bodyObject;

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)aResponse;

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

- (void)setDelegate:(id)aTarget selector:(SEL)aSelector;


@property (nonatomic, retain) NSMutableData *receivedData;

@property (nonatomic, retain) NSURLResponse *response;

@property (nonatomic, assign) NSString *result;

@property (nonatomic, assign) id target;

@property (nonatomic, assign) SEL selector;


@end



[HTTPRequest.m]

#import "HTTPRequest.h"


@implementation HTTPRequest


@synthesize receivedData;

@synthesize response;

@synthesize result;

@synthesize target;

@synthesize selector;


- (BOOL)requestUrl:(NSString *)url bodyObject:(NSDictionary *)bodyObject

{

    // URL Request 객체 생성

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]

                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy

                                                       timeoutInterval:5.0f];

    

    // 통신방식 정의 (POST, GET)

    [request setHTTPMethod:@"POST"];

    

    // bodyObject 객체가 존재할 경우 QueryString형태로 변환

    if(bodyObject)

    {

        // 임시 변수 선언

        NSMutableArray *parts = [NSMutableArray array];

        NSString *part;

        id key;

        id value;

        

        // 값을 하나하나 변환

        for(key in bodyObject)

        {

            value = [bodyObject objectForKey:key];

            part = [NSString stringWithFormat:@"%@=%@", [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],

[value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

            [parts addObject:part];

        }

        

        // 값들을 & 연결하여 Body 사용

        [request setHTTPBody:[[parts componentsJoinedByString:@"&"] dataUsingEncoding:NSUTF8StringEncoding]];

    }

    

    // Request 사용하여 실제 연결을 시도하는 NSURLConnection 인스턴스 생성

    NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

    

    // 정상적으로 연결이 되었다면

    if(connection)

    {

        // 데이터를 전송받을 멤버 변수 초기화

        receivedData = [[NSMutableData alloc] init];

        return YES;

    }

    

    return NO;

}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)aResponse

{

    // 데이터를 전송받기 전에 호출되는 메서드, 우선 Response 헤더만을 먼저 받아 온다.

    //[receivedData setLength:0];

    self.response = aResponse;

}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    // 데이터를 전송받는 도중에 호출되는 메서드, 여러번에 나누어 호출될 있으므로 appendData 사용한다.

    [receivedData appendData:data];

}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    // 에러가 발생되었을 경우 호출되는 메서드

    NSLog(@"Error: %@", [error localizedDescription]);

}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    // 데이터 전송이 끝났을 호출되는 메서드, 전송받은 데이터를 NSString형태로 변환한다.

    result = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];

    

    // 델리게이트가 설정되어있다면 실행한다.

    if(target)

    {

        [target performSelector:selector withObject:result];

    }

}


- (void)setDelegate:(id)aTarget selector:(SEL)aSelector

{

    // 데이터 수신이 완료된 이후에 호출될 메서드의 정보를 담고 있는 셀렉터 설정

    self.target = aTarget;

    self.selector = aSelector;

}


- (void)dealloc

{

    [receivedData release];

    [response release];

    [result release];

    [super dealloc];

}


@end


  출처 : http://iamgsi.tistory.com/entry/iphone%EC%97%90%EC%84%9C-http-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-getpost-%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C%EB%8A%94-%ED%8D%BC%EC%99%94%EC%8A%B5%EB%8B%88%EB%8B%A4