2010-01-15 1 views
20

NSURLConnection을 사용하여 POST 데이터를 PHP 스크립트로 보내는 데 문제가 있습니다. 이건 내 코드입니다 :NSURLConnection을 사용하여 POST를 보내는 iPhone

const char *bytes = [[NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data] UTF8String]; 

    NSURL *url = [NSURL URLWithString:@"http://myurl.com/script.php"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]]; 

    NSURLResponse *response; 
    NSError *err; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    NSLog(@"responseData: %@", responseData); 

그리고 내이 script.php이만큼 간단하다 :

<?php 
    echo $_POST['mydata']; 
?> 

이 과거에 나를 위해 일한하지만, 어떤 이유로 출력 내가 지금 NSLog(@"responseData: %@", responseData);에서 얻을 "theData"대신 "<>"입니다.

아마도 약간의 절름발이 실수가있을 수 있지만 그걸 찾을 수없는 것일까 요? 어떤 아이디어?

답변

39

데이터가 잘못되었습니다. 이 데이터는 PHP의 $의 _POST 배열에서 발견 될 것으로 예상하는 경우는 다음과 같이한다 :

const char *bytes = "mydata=Hello%20World"; 

를 사용하면 XML 데이터를 보낼 경우 다른 HTTP의 콘텐츠 형식을 설정해야합니다. 예 : 더 HTTP의 콘텐츠 형식,

application/x-www-form-urlencoded 

사용되는 기본 유형을 설정하지 않으면 당신은

application/xml; charset=utf-8 

을 설정할 수 있습니다. 그리고이 유형은 POST 데이터가 GET 요청에서와 동일한 형식을 가질 것으로 기대합니다.

그러나 application/xml과 같은 다른 HTTP Content Type을 설정하면이 데이터는 PHP의 $ _POST 배열에 추가되지 않습니다. 입력 스트림에서 원시를 읽어야합니다.

NSString * str = [NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:[str dataUsingEncoding:NSUTF8StringEncoding]]; 

를 서버에 다음과 같은 PHP 시도 :

이 시도

$handle = fopen("php://input", "rb"); 
$http_raw_post_data = ''; 
while (!feof($handle)) { 
    $http_raw_post_data .= fread($handle, 8192); 
} 
fclose($handle); 

이 비로소 작동하여 POST의 HTTP 헤더 응용 프로그램/x를 - www가없는 경우 양해 바랍니다 -form-urlencoded. application/x-www-form-urlencoded이면 PHP 자체가 모든 게시물 데이터를 읽고이를 (키/값 쌍으로) 디코드 한 다음 $ _POST 배열에 추가합니다.

+1

아, 그래 ... 환호. 그러나 responseData 출력은 "<48656c6c 6f326f72 6c64>"와 비슷하지만 % @를 사용하여 NSData를 인쇄하지 않습니까? –

+0

[setValue 요청 : @ "xxx"forHTTPHeaderField : @ "Content-Type"]에 감사드립니다. – Nils

+0

안녕하세요, HTTP Content-Type과 함께 "text/xml; charset = utf-8"을 사용하고 있지만 요청을 보내는 것은 괜찮습니다. "application/xml; charset = utf-8"을 사용하고 HTTP Content-Type을 함께 사용하는 것이 문제입니다. , 데이터가 반환됩니다 : "서버가 미디어 유형이 지원되지 않기 때문에 요청을 처리 할 수 ​​없습니다". 그럼 어떻게 될까요? – AmyNguyen

2

POST 데이터와 XML 데이터가 동일하지 않습니다. XML 데이터를 전달할 수 있지만 PHP 코드는 요청 본문에서 XML을 파싱해야합니다. PHP의 xml_parse (http://php.net/manual/en/function.xml-parse.php)가이를 도와줍니다. 당신이 POST 데이터를 전송 선호하는 경우

또한,이 같은 요청 본문을 설정

const char *bytes = [[NSString stringWithFormat:@"mydata=%@", data] UTF8String];

8

아 그래 ... 환호. 그러나 responseData 출력은 "< 48656c6c 6f326f72 6c64>"와 같이 NSData를 % @와 함께 인쇄하지 않습니까?- 당신이있는 NSString에 전달해야 당신이 "바이트"값을 보이고 있기 때문이다 13시 57분

에서 1월 15일 '10 per_pilot 실제 메시지

NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]; 
NSLog(@"responseData: %@", string); 
7
NSString *post =[NSString stringWithFormat:@"usertype(%@),loginname(%@),password(%@)",txtuser.text,txtusername.text,txtpassword.text]; 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:@"http://www.dacinci.com/app/tes2/login_verify.php"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

NSError *error; 
NSURLResponse *response; 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString *str=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
+0

표준 형식 : ... stringWithFormat : @ "usertype = % @ & loginname = % @ & password = % @" ;) – RTOSkit

2

를하는 경우 참조하는 방법 사용 NSURLSession는 iOS9에 PHP에서

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
[request addValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
request.HTTPMethod = @"POST"; 

세트

db (MySql5)에서 utf-8_generic을 설정하십시오.