2011-11-07 87 views
1

我是新的Objective-C,我在應用程序中工作,我需要使用HTTP Post連接到Java的servlet。使用HTTP發送和接收字符串Post

我在互聯網上搜索,發現了很多與NSMutableURLRequest NSURLConnection有關的信息。 我做了一些測試,現在我可以發送和接收字符串,但我需要做一些改變,我不知道該怎麼辦。

我想發送一條消息到我的Servlet使用一個字符串(完成),我想停止執行,直到收到來自Servlet的響應(這是我的問題)。我不能停止執行,我不知道該怎麼做。

這是我的代碼:

- (NSString *)sendPostRequest: (NSString*)stringToSend { 

//URL en formato String 
NSString *urlString = @"http://192.168.1.1:8080/Servlet/ListenerServlet"; 

//Armo el Body con los Datos a enviar 
NSMutableString* requestBody = [[NSMutableString alloc] init]; 
[requestBody appendString:stringToSend]; 

//Creo el Request 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

//Creo el Objecto con la URL dentro 
NSURL *url = [NSURL URLWithString: [NSString stringWithString:urlString]]; 

//Seteo la URL al Request 
[request setURL:url]; 

//Armo los Datos a Enviar 
NSString* requestBodyString = [NSString stringWithString:requestBody]; 
NSData *requestData = [NSData dataWithBytes: [requestBodyString UTF8String] length: [requestBodyString length]]; 

//Seteo el Metodo de Envio 
[request setHTTPMethod: @"POST"]; 

//Seteo los Datos a Enviar 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[request setHTTPBody: requestData]; 

//Creo la Conexion y automaticamente se envia 
[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

[requestBody release]; 
[request release]; 

return @""; 
} 

有人可以幫我嗎?

謝謝,對不起我的英文不好

+0

我強烈建議ASIHTTPRequest,很容易和強大。 http://allseeing-i.com/ASIHTTPRequest/How-to-use – jbat100

回答

1

最後,我使用NSMutableURLRequest和帶有sendSynchronousRequest的NSURLConnection工作。

這是所使用的代碼:

- (NSString*) sendPostRequest:(NSString *)stringToSend{ 

NSString *urlString = [self serverURL]; 

NSURL *url = [NSURL URLWithString: urlString]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

[request setHTTPMethod:@"POST"]; 

//set headers 

[request addValue:@"Content-Type" forHTTPHeaderField:@"application/x-www-form-urlencoded"]; 

[request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

[request setHTTPBody:[stringToSend dataUsingEncoding:NSASCIIStringEncoding]]; 

[request setTimeoutInterval:90]; // set timeout for 90 seconds 

NSURLResponse **response = NULL; 

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:response error:nil]; 

NSString *responseDataString = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]; 

NSLog(@"Response %@", responseDataString); 

return responseDataString; 

}

1

你試圖以同步的方式來使用異步API(的NSURLRequest)。使用委託模式使NSURLRequest在後臺工作。您開始一個請求,並且當數據可用或連接完成時,該請求會調用其委託的委託方法。

您應該重新利用您的應用程序,以便它可以這樣工作。網絡操作可能需要很長時間,除非必須,否則您不應該停止用戶的操作。

如果您必須在網絡操作完成之前停止您的應用程序,則應該設置某種停用/恢復功能來禁用您的UI,而不是佔用主線程。

jbat100建議ASIHTTPRequest。這可能是矯枉過正,也是異步工作,並已被作者放棄。我會說,如果你需要使用網絡庫,你應該看看AFNetworking。再一次,可能是過度殺傷,絕對是異步的,但主動維護並使用基於塊的界面。

+0

是的,你的分析是正確的。我知道我必須重新設計我的應用程序,而且我仍然在尋找一些庫本機代碼以同步方式工作。感謝您的回答。 如果有人有其他的想法或圖書館分享,我會感激。 再次感謝 –

+0

如果你需要同步,我強烈建議你避免,你總是可以使用'NSString'和'NSData'' + stringWithContentsOfURL:encoding:error:'和'+(id)dataWithContentsOfURL:(NSURL *)aURL選項:(NSDataReadingOptions)掩碼錯誤:(NSError **)errorPtr'。問題在於它會干擾您嘗試給出的任何視覺反饋,因爲它會阻止主線程。嘗試在進行長時間同步下載之前加入微調,並且您會注意到它不會旋轉。 –

相關問題