前面我們學習過了多線程的諸多知識,現在該學習網絡,學習網絡少不了的是發送網絡請求,跟服務器進行交互。在iOS中,發送網絡請求可以使用NSURLConnection類
這沒什么好說的,我們可以將字符串變成URL,也可以直接設置URL,例如:
//這里對字符串進行的處理是因為URL里面不支持中文,而進行的百分號變換,將中文變成百分號格式NSString *urlStr = [@"http://120.25.226.186:32812/login?username=123&pwd=123" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];NSURL *url = [NSURL URLWithString:urlStr];
可以直接設置請求對象,用NSURLRequest,但是這樣不能對請求進行更細致的設置
NSURLRequest *request = [NSURLRequest requestWithURL:url];
要進行更細致的設置,如請求方式,請求頭等的設置,只能使用NSURLRequest的子類NSMutableURLRequest:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];request.HTTPMethod = @"POST";// 請求體NSString *bodyStr = @"username=123&pwd=123";request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
我們一共可以設置的請求屬性如下表示:
設置請求超時等待時間(超過這個時間就算超時,請求失?。? (void)setTimeoutInterval:(NSTimeInterval)seconds;設置請求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;設置請求體- (void)setHTTPBody:(NSData *)data;設置請求頭- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
參數:
特點:
根據對服務器返回數據的處理方式的不同,又可以分為2種
1、block回調方式的異步
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
2、代理的方式異步
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
在startImmediately = NO的情況下,需要調用start方法開始發送請求
- (void)start;
成為NSURLConnection的代理,要遵守NSURLConnectionDataDelegate協議
開始接收到服務器的響應時調用- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;接收到服務器返回的數據時調用(服務器返回的數據比較大時會調用多次)- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;服務器返回的數據完全接收完畢后調用- (void)connectionDidFinishLoading:(NSURLConnection *)connection;請求出錯時調用(比如請求超時)- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
創建GET請求NSString *urlStr = [@"http://120.25.226.186:32812/login?username=123&pwd=123" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];NSURL *url = [NSURL URLWithString:urlStr];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];創建POST請求NSString *urlStr = @"http://120.25.226.186:32812/login";NSURL *url = [NSURL URLWithString:urlStr];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];request.HTTPMethod = @"POST";// 請求體NSString *bodyStr = @"username=123&pwd=123";request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
例如:
NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小黃人&pwd=520it&type=JSON";urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];NSURL *url = [NSURL URLWithString:urlStr];
新聞熱點
疑難解答