2011-06-16 188 views
-1

我需要連接到服務器而不鍵入「http://」。我只需要獲取用戶的服務器名稱和端口號。有了這個,我應該能夠連接到特定服務器...在目標c中發送HTTP請求

回答

5

最簡單的形式,它看起來是這樣的:

- (void)loadHostName:(NSString *)hostName onPort:(NSInteger)portNumber { 

    responseData = [[NSMutableData alloc] init]; 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i", hostName, portNumber]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    [connection release]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [responseData setLength:0]; 
} 

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Oh noes! %@", [error localizedDescription]); 
    [responseData release]; 
} 

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

    // Do something with the data, like load it in a web view. 
    [webView loadData:responseData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:nil]; 
    [responseData release]; 
} 

在生產代碼中,你應該處理緩存請求,驗證挑戰(請參閱NSURLConnection上的消息),但上面的示例將發送HTTP請求並將其加載到Web視圖中。

+0

@Richard設置你的ivars到零,當你與完成他們總是做一件好事,但是我把它留在了這個問題上。自動釋放它是沒有意義的。 – 2011-07-07 08:24:57

+0

根據請求的結果,'connectionData'變量最後一次在'connectionDidFinishLoading:'或'connection:didFailWithError:'中被訪問。沒有更多的NSURLConnection回調函數,所以沒有東西可以再次訪問變量,並將它設置爲nil不會給你帶來任何好處。同樣的事情autorelasing它。這只是意味着autorelease池將在稍後發佈,而不是你現在這樣做。在這兩種情況下,你都完成了這個變量,所以你最好儘可能的保持你的內存管理。也不要在'dealloc'中釋放它。 – 2011-07-07 12:43:24

+0

你不是在談論我正在談論的案例。這不是生產力。刪除。 – Richard 2011-07-07 13:24:26

1

試試這個,

NSURL *aUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i", hostName, portNumber]]; 
NSURLRequest *request = [NSURLRequest requestWithURL:aUrl 
             cachePolicy:NSURLRequestUseProtocolCachePolicy 
            timeoutInterval:60.0]; 


    NSURLResponse *resp = nil; 
    NSError *err = nil; 
    NSData *response = [NSURLConnection sendSynchronousRequest: theRequest    returningResponse: &resp error: &err]; 
NSString * theString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
[resp release]; 
[err release]; 
NSLog(@"response: %@", theString); 
+0

同步請求不好,因爲: 1.它們阻塞運行循環,所以如果它們在主線程上調用,則在等待響應時UI被鎖定。 2.您無法取消同步請求。 3.您無法響應身份驗證挑戰。 4.您無法驗證SSL證書錯誤。 5. ... 請不要使用同步請求,即使它們需要較少的代碼。 – 2011-06-16 07:30:52

0

也可以硬編碼HTTP://與服務器名稱

例如

NSString *serverName = "stackoverflow.com"; 
NSNumber *portNumber = 10; 
NSString *finalYrl = [NSString StringWithFormat:@"HTTP://%@:%@",serverName , portNumber];