iOS-----使用NSURLConnection
使用NSURLConnection???
如果只是為了讀取HTTP等服務器數據,或向服務器提交數據,iOS還提供了NSURLConnection類,NSURLConnection使用NSURLRequest向遠程服務器發送同步或異步請求,并獲取服務器響應的數據。除了NSURLRequest之外,還可使用NSMutableURLRequest向服務器發送數據。
使用NSURLConnection從網絡獲取數據
? NSURLConnection可用于根據URL加載服務器響應,該對象的方法并不多,如果使用該對象來異步加載服務器響應,則需要為該對象指定一個遵守NSURLConnectionDelegate協議的對象,該對象作為NSURLConnection的delegate,負責處理異步加載過程中的事件。
?? 除此之外,還可使用NSURLConnection的sendSynchronousRequest:returningResponse:error:類方法同步架子啊服務器響應。
?? NSURLConnection大致提供了如下常用的方法。
?
| - (NSURLRequest *)originalRequest: 獲取該NSURLConnection最初的NSURLRequest對象的深拷貝 |
| - (NSURLRequest *)currentRequest: 返回該NSURLConnection當前使用的NSURLRequest對象 |
| 采用同步請求的方式獲取網絡數據的方法如下 |
| + sendSynchronousRequest:returningResponse:error:第1個參數代表發送請求的NSURLRequest對象;第2個參數需要傳入NSURLRequest對象的指針,用于獲取服務器響應對象;第3個參數用于保存獲取的錯誤信息。 |
采用異步請求的方式獲取網絡數據的方法如下
| + connectionWithRequest:delegate::采用異步請求的方式獲取數據。第2個參數作為NSURLConnection的delegate。 | |||
| - initWithRequest:delegate: : 與上一個方法基本相同,只是該方法是實例方法,必須先調用alloc,再調用該方法 | |||
| - initWithRequest:delegate:startImmediately:: 與前一個方法的功能基本相似,只是多了一個startImmediately參數,該參數控制是否立即發送請求 | |||
| + sendAsynchronousRequest:queue:completionHandler: : 該方法需要額外指定NSOperationQueue參數,表明將請求交給指定的NSOperationQueue處理. | |||
| - ?start: 開始發送請求.只是當通過- initWithRequest:delegate:startImmediately:方法發送請求,且最后一個參數為NO時,才需要調用該方法。 | |||
| 使用NSURLConnection從網絡獲取數據的步驟如下 | |||
| 1.??????? 創建NSURLRequest對象,該對象代表對遠程服務器的請求。該對象可以包括請求的URL、緩存策略、超時時長等信息。 2.??????? 調用NSURLConnection的實例方法或類方法,以NSURLRequest對象為參數創建NSURLConnection即可發送請求。 3.??????? 如果調用方法以異步方式加載服務器響應,則需要為NSURLConnection對象指定delegate對象,因此還需要為delegete對象實現特定的方法。 | |||
| 代碼片段 | |||
| ViewController.m@implementation ViewControllerNSMUtableData* totalData;- (void)viewDidLoad{[super viewDidLoad];NSString* str = @http://www.crazyit.ory/ethos.php;
totalData = [[NSMutableData alloc] init];// 以指定NSString創建NSURL對象
NSURL * url = [NSURL URLWithString:str];// 創建NSURLRequest對象// NSURLRequest* request = [NSURLRequest requestWithURL:url];// 通過這種方式創建的NSURLRequest可以指定緩存策略、超時時長
NSURLRequest* request = [NSURLRequest requestWithURL:urlcachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];// 以指定URL、delegate創建連接、發送請求
NSURLConnection* conn = [NSURLConnection connectionWithRequest:request delegate:self ];// 如果conn為nil,則直接返回if(conn !=nil){return;}}// 當服務器響應生成時激發該方法- (void)connection: (NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{NSLog(@”++didReceiveResponse++”);NSLog(@”響應的數據類型:: %@” , response.MIMEType);// 獲取響應數據的長度,如果不能檢測到長度,則返回NSURLResponseUnknownLength(-1)
NSLog(@”響應的數據長度為: %lld”, response.expectedContentLength);NSLog(@”響應的數據所使用的字符集: %@”, response.textEncodingName);NSLog(@”響應的文件名: %@”, response.suggestedFilename);}// 每次讀取服務器響應的數據時,都會激發該方法// 對于一個請求而言,服務器數據可能要分幾次才能讀取,因此該方法將會被處罰多次// 如果程序需要將這些數據轉換成字符串,則建議使用NSMutableData來收集這些數據.然后整體轉換- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*) data{[totalData appendData:data];}// 當連接服務器出現錯誤時激發該方法.可通過error獲取錯誤信息- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{NSLog(@”++error++”);}// 當數據load完成時激發該方法.對于每次請求,該方法只會被激發一次- (void)connectionDidFinishLoading:(NSURLConnection *)connection{NSLog(@”++finishLoading++”);NSString* content = [[NSString alloc] initWithData:totalDataencoding:NSUTF8StringEncoding];// 清空所有數據
[totalData setLength:0];self.showView.text = content;}@end ? | |||
| ? 上面程序中的第1行紅色字代碼創建了一個NSURLRequest對象,第2行紅色字代碼以NSURLRequest對象為參數,以該視圖控制器本身作為delegate,創建了NSURLConnection對象,創建該對象即可向遠程服務器發送請求。 ?? 由于程序制定使用視圖控制器本身作為NSURLConnection的delegate,因此該視圖控制器實現了NSURLConnectionDataDelegate協議,并實現了該協議中幾個特定的方法。 ?? 隨著服務器響應的到來,NSURLConnection的delegate對象的如下方法依次被調用
? |
?
使用NSMutableURLRequest向服務器發送數據
? NSMutableURLRequest不僅可以添加請求頭,還可以添加請求參數,這樣即可向服務器發送數據了.
| NSMutableURLRequest新增了如下常用方法 |
| - addValue:forHTTPHeaderField: 該方法用于為NSMutableURLRequest添加請求頭 |
| - setAllHTTPHeaderFields: 該方法通過一個NSDictionary一次性地為NSMutableURLRequest設置多個請求頭 |
| - setHTTPBody: 設置NSMutableURLRequest的請求體數據-----也就是設置請求參數 |
| - setHTTPBodyStream: 以NSInputStream為參數設置NSMutableURLRequest的請求體數據.該方法與setHTTPBody方法只能設置一個 |
| - ?setHTTPMethod: 設置提交請求的方式,要么是POST,要么是GET, 默認是GET. |
| -? setHTTPShouldHandleCookies: 設置該HTTP請求是否處理Cookie. |
| -? setValue:forHTTPHeaderField: 為指定的請求頭設置請求值 |
| 代碼示例 |
| 1 ViewController.m
2
3 @implementation ViewController
4
5 NSMutableData* totalData;
6
7 - (void)viewDidLoad
8
9 {
10
11 [super viewDidLoad];
12
13 NSString* str = @”http://192.168.1.88.8888/abc/login.jsp”;
14
15 totalData = [[NSMutableData alloc] init];
16
17 // 以指定NSString創建NSURL對象
18
19 NSURL* url = [NSURL URLWithString:str];
20
21 // 創建NSURLRequest對象
22
23 // NSURLRequest* request = [NSURLRequest requestWithURL: url];
24
25 // 通過這種方式創建的NSURLRequest可以指定緩存策略、超時時長
26
27 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url
28
29 cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
30
31 timeoutInterval:5];
32
33 // --------------------下面代碼開始設置請求參數--------------------
34
35 // 準備請求參數
36
37 NSString* post = [NSString stringWithFormat:@”name=%@&pass=%@”, @”crazyit.org”, @”瘋狂軟件”];
38
39 // 將請求參數轉換為NSData
40
41 NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
42
43 NSString *postLength = [NSString stringWithFormat:@”%d”, [postData length]];
44
45 // 設置請求的方式,默認發送GET請求
46
47 [request setHTTPMethod:@”POST”];
48
49 // 添加兩個請求頭
50
51 [request setValue:postLength forHTTPHeaderField:@”Content-Length”];
52
53 [request setValue:@”application/x-www-form-urlencoded”
54
55 forHTTPHeaderField:@”Content-Type”];
56
57 // 將請求數據設置為HTTP請求體
58
59 [request setHTTPBody:postData];
60
61 // 以指定URL、delegate創建連接、發送請求
62
63 NSURLConnection* conn = [NSURLConnection connectionWithRequest:request
64
65 delegate:self];
66
67 // 如果conn為nil,則直接返回
68
69 if(conn != nil)
70
71 {
72
73 return;
74
75 }
76
77 }
78
79 // 當服務器響應生成時激發該方法
80
81 - (void)connection: (NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
82
83 {
84
85 NSLog(@”++didReceiveResponse++”);
86
87 NSLog(@”響應的數據類型:: %@” , response.MIMEType);
88
89 // 獲取響應數據的長度,如果不能檢測到長度,則返回NSURLResponseUnknownLength(-1)
90
91 NSLog(@”響應的數據長度為: %lld”, response.expectedContentLength);
92
93 NSLog(@”響應的數據所使用的字符集: %@”, response.textEncodingName);
94
95 NSLog(@”響應的文件名: %@”, response.suggestedFilename);
96
97 }
98
99 // 每次讀取服務器響應的數據時,都會激發該方法
100
101 // 對于一個請求而言,服務器數據可能要分幾次才能讀取,因此該方法將會被處罰多次
102
103 // 如果程序需要將這些數據轉換成字符串,則建議使用NSMutableData來收集這些數據.然后整體轉換
104
105 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*) data
106
107 {
108
109 [totalData appendData:data];
110
111 }
112
113 // 當連接服務器出現錯誤時激發該方法.可通過error獲取錯誤信息
114
115 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
116
117 {
118
119 NSLog(@”++error++”);
120
121 }
122
123 // 當數據load完成時激發該方法.對于每次請求,該方法只會被激發一次
124
125 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
126
127 {
128
129 NSLog(@”++finishLoading++”);
130
131 NSString* content = [[NSString alloc] initWithData:totalData
132
133 encoding:NSUTF8StringEncoding];
134
135 // 清空所有數據
136
137 [totalData setLength:0];
138
139 self.showView.text = content;
140
141 }
142
143 @end ? |
| ? 上面程序的關鍵在于紅色字代碼部分,該紅色字代碼設置了發送POST請求,而且將一個形如”name = crazyit.org&pass=瘋狂軟件”的字符串轉換成NSData后作為請求參數,并根據請求參數設置了兩個請求頭的值-----這樣就得到了一個帶請求參數的NSMutableURLRequest |
轉載于:https://www.cnblogs.com/congli0220/p/5058677.html
總結
以上是生活随笔為你收集整理的iOS-----使用NSURLConnection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之路【第七篇】:初识Sock
- 下一篇: ‘vagrant up’ fails t