2012-03-04 79 views
1

我有一個小的Mac應用程序,應該可以將數據發佈到我的web服務器,該服務器將數據保存在數據庫中。現在這是我現在的代碼:如何獲取URL的頁面內容請求(發佈)

NSData *postData = [urlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

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

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"http://..."]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (connection) NSLog(@"Done"); 

它工作正常。但是現在我想檢查數據是否正確(並存儲在數據庫中)或者某些事情(如電子郵件)是錯誤的。 PHP文件打印例如如果電子郵件不正確,請輸入「電子郵件地址不正確」。 但是我怎樣才能獲取這些數據(哪些PHP打印出來)在Xcode的應用程序知道它是否成功或不?

感謝您的回答!

回答

2

爲NSURLConnection的實施委託方法,

- (無效)連接:(NSURLConnection的*)連接didReceiveResponse:(NSURLResponse *)響應。 當請求結束時,該方法由應用程序調用。您可以使用'響應'參數訪問響應數據。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 

然後,只需轉換「數據」參數爲使用字符串:

NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

然後你可以搜索你想要的任何字符串的響應,例如,「郵件不正確」。 PS:我通常不會對HTTP請求使用NSURLConnection/NSURLRequest,我建議您查看ASIHTTPRequest以獲取真正簡單的HTTP請求/連接。

希望這會有所幫助。

+0

謝謝你的回答,但是如何將響應轉換爲字符串? – Dion 2012-03-04 16:10:59

+0

看到我編輯的答案。對困惑感到抱歉。正如我所說的,由於ASIHTTPRequest,我暫時還沒有使用NSURLRequest等。強烈建議你檢查一下。 – 2012-03-04 16:40:22

+0

啊,非常感謝你,它的工作原理!:) 與ASIHTTPRequest我會稍後退房,對於這個應用程序,我認爲這也是好的。 ASIHTTPRequest更合適些什麼? – Dion 2012-03-04 21:23:55

3

您需要實現NSURLConnectionDelegate方法connection:didReceiveData:connectionDidFinishLoading:

按照文檔didReceiveData:有可能根據的NSURLRequest被調用多次(即響應不會一直到達一次全部),因此推薦的方法是追加傳入的數據在connection:didReceiveData:期間緩衝,然後對connectionDidFinishLoading:中的數據進行任何處理。

你可以在你的類創建一個屬性是這樣的:

@property (nonatomic, strong) NSMutableData *dataBuffer; 

,並在viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.dataBuffer = [[NSMutableData alloc] init]; 

    // do any other setup your class requires...  
} 

實例化緩衝區,然後實現委託方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    // clear the buffer in case it has been used previously 
    [self.dataBuffer setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.dataBuffer appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
    NSString *response = [NSString stringWithUTF8String:[self.dataBuffer bytes]]); 
    NSLog(@"response from HTTP request=>%@", response); 
} 

這都可以使用像這樣的第三方網絡庫來完成(不再處於積極的開發階段)或AFNetworking,但有時候這些可能是過度殺毒,取決於你想要完成什麼