본문 바로가기

개발도구/iOS - 아이폰 개발

[iphone] ssl http ios POST/GET method / iphone image send

facebook 친구 리스트가 300명 이니데, my sql 에 아래의 get 방식으로 넣으려고 하니 url 크기가 길어 집어 넣을수 없었다. 
알아본 결과 post는 아무런 제약이 없이 잘 들어가게 되었다. get 방식은 url 주소는 총 2000자 이상은 안들어가니 참고 바랍니다.
post 전송


NSString
*post =[[NSString alloc] initWithFormat:@"userName=%@&password=%@",userName.text,password.text];
 NSURL
*url=[NSURL URLWithString:@"https://localhost:443/SSLLogin/Login.php"];

 
NSLog(post);
 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

 
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
 
[request setURL:url];
 
[request setHTTPMethod:@"POST"];
 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
 
[request setHTTPBody:postData];

/* when we user https, we need to allow any HTTPS cerificates, so add the one line code,to tell teh NSURLRequest to accept any https certificate, i'm not sure about the security aspects
*/


[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];

 
NSError *error;
 
NSURLResponse *response;
 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

 
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
 
NSLog(@"%@",data);

get 전송
NSString *params1 = [NSString stringWithFormat:@"http://%@%@?ufeedPostId=%@&ufeedFbName=%@&ufeedFbId=%@&ufeedFbList=%@", HOST, REGIST_FB_LIST_URL, self.feedPostId, self.feedPostId, self.feedPostId, feed];
NSLog(@"params1=%@",params1);

//unicode 파라메타 값 넘기기
NSURLRequest *request1 = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:[params1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];

NSLog(@"request = %@",request1);
[NSURLConnection connectionWithRequest:request1 delegate:self];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

이미지 전송

NSData *imageData = UIImagePNGRepresentation(userImageView.image); // UIImageView에 있는 이미지를 받아옴
   
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
   
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
   
    NSString *boundary = [NSString stringWithString:@"Aa12334485778888"];    // boundary문자열을 생성
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data, boundary=%@",boundary];
   
    [request addValue:contentType forHTTPHeaderField:@"Content-type"];
   
    NSMutableData *body = [NSMutableData data];

    // 첫번째 user name value
    [body appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"content-disposition: form-data; name=\"username\"\r\n\r\nppling"] dataUsingEncoding:NSUTF8StringEncoding]];  
   
      
    // file data
    // RFC문서를 보면 이미지 파일에 대해서 별도의 boundary를 다시 설정해 주는데요. 일단 리눅스서버에 PHP로 작업한 경우에는
    // 지금처럼 작성해도 문제가 없었습니다만 다른 서버에는 문제가 될지도 모르겠습니다.

    //이미지 고유값 만들기
   // NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
    id uuid = [defaults objectForKey:@"ufeedPostId"];         
    NSString *ufeedPostId = (NSString *)uuid;   
   
   
    /////// 다섯번째 ufeedPostId 데이터   
    [body appendData:[[NSString stringWithFormat:@"r\n--%@\r\n", boundary]
                      dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;name=\"ufeedPostId\";\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:ufeedPostId] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
   
   
    /////// 육번째 png file 데이터   
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];   
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition:form-data;name=\"imgfile\";filename=\"%@.png\"\r\n",ufeedPostId] dataUsingEncoding:NSUTF8StringEncoding]];
   
    [body appendData:[[NSString stringWithFormat:@"Content-Type:application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding] ];
    [body appendData:imageData]; // 실제 이미지 Data를 append 해줌
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding] ];
   
    [request setHTTPBody:body];

webview에 post 전송

UIWebView에 post 전송 타입의 url을 사용하여 화면에 출력하고 싶다면

NSURL *url = [NSURL URLWithString: @"http://blueb.net/search"];
NSString *body = [NSString stringWithFormat: @"arg1=%@&arg2=%@", @"val1",@"val2"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];
[webView loadRequest: request];

한글의 경우 데이터를 받아 처리 하는 서버쪽 문자셋이 euckr인 경우 문제가 생길 수 있습니다 .
이련 경우에는 아래 같이 사용하세요

NSString *val = @"한글";
val = [val stringByAddingPercentEscapesUsingEncoding:0x80000000 + kCFStringEncodingDOSKorean]
NSString *body = [NSString stringWithFormat: @"arg1=%@", val];

서버쪽 문자셋이 utf8인 경우에는


NSString *val = @"한글";
val = [val stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
NSString *body = [NSString stringWithFormat: @"arg1=%@", val];
stringByAddingPercentEscapesUsingEncoding:[NSASCIIStringEncoding | NSUTF8StringEncoding | 0x80000000 + kCFStringEncodingDOSKorean]