網(wǎng)絡(luò)請求NSURLConnection筆記

發(fā)送異步請求

-(void)async
{

// 0.請求路徑
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
// 1.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2.發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    // 請求完畢會來到這個block
    // 3.解析服務(wù)器返回的數(shù)據(jù)(解析成字符串)
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", string);
}];

}

發(fā)送同步請求

-(void)sync
{

// 0.請求路徑
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
  // 1.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2.發(fā)送請求
// sendSynchronousRequest阻塞式的方法,等待服務(wù)器返回數(shù)據(jù)
NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// 3.解析服務(wù)器返回的數(shù)據(jù)(解析成字符串)
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@ %@", string, response.allHeaderFields);

}

NSURLConnection下載代理

#define FilePath [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"1.zip"]
@interface ViewController () <NSURLConnectionDataDelegate>
//輸出流對象
@property (nonatomic, strong) NSOutputStream *stream;
//用來存放服務(wù)器返回的數(shù)據(jù)
@property (nonatomic, strong) NSMutableData *responseData;
//文件的總長度
@property (nonatomic, assign) NSInteger contentLength;
//當(dāng)前下載的總長度
@property (nonatomic, assign) NSInteger currentLength;
//文件句柄對象
@property (nonatomic, strong) NSFileHandle *handle;
@end

  • 設(shè)置請求和代理
    -(void)delegateAysnc
    {
// 0.請求路徑
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
// 1.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
/*
//2.創(chuàng)建連接對象
[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[conn start];
 //取消
[conn cancel];
 */
[NSURLConnection connectionWithRequest:request delegate:self];

--------------------下面是在子線程啟動------------------------

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]] delegate:self];
    // 決定代理方法在哪個隊(duì)列中執(zhí)行
    [conn setDelegateQueue:[[NSOperationQueue alloc] init]];
    // 啟動子線程的runLoop
    self.runLoop = CFRunLoopGetCurrent();
    // 啟動runLoop
    CFRunLoopRun();
    // connectionDidFinishLoading方法停止RunLoop
    CFRunLoopStop(self.runLoop);
});

}

  • 接收到服務(wù)器的響應(yīng)
    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
// 創(chuàng)建data對象
self.responseData = [NSMutableData data];
NSLog(@"didReceiveResponse");
/** -------------------------------下面是下載大文件------------------------------- **/
if (0) {
    // 獲得文件的總長度
    self.contentLength = [response.allHeaderFields[@"Content-Length"] integerValue];
    // 創(chuàng)建一個空的文件
    [[NSFileManager defaultManager] createFileAtPath:FilePath contents:nil attributes:nil];
    // 創(chuàng)建文件句柄
    self.handle = [NSFileHandle fileHandleForWritingAtPath:FilePath];
} else {//NSOutputStream下載大文件
    // response.suggestedFilename : 服務(wù)器那邊的文件名
    // 文件路徑
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *file = [caches stringByAppendingPathComponent:response.suggestedFilename];
    // 利用NSOutputStream往Path中寫入數(shù)據(jù)(append為YES的話筑公,每次寫入都是追加到文件尾部)
    self.stream = [[NSOutputStream alloc] initToFileAtPath:file append:YES];
    // 打開流(如果文件不存在雳窟,會自動創(chuàng)建)
    [self.stream open];
}

}

  • 接收到服務(wù)器的數(shù)據(jù)(如果數(shù)據(jù)量比較大,這個方法會被調(diào)用多次)
    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
// 不斷拼接服務(wù)器返回的數(shù)據(jù)(小文件)
[self.responseData appendData:data];
NSLog(@"didReceiveData -- %zd", data.length);
/**-------------------------------下載大文件-------------------------------**/
if (0) {
    // 指定數(shù)據(jù)的寫入位置 -- 文件內(nèi)容的最后面
    [self.handle seekToEndOfFile];
    // 寫入數(shù)據(jù)
    [self.handle writeData:data];
    // 拼接總長度
    self.currentLength += data.length;
} else {//NSOutputStream下載大文件
         [self.stream write:[data bytes] maxLength:data.length];//拼接數(shù)據(jù)
         }

}

  • 服務(wù)器的數(shù)據(jù)成功接收完畢
    -(void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
NSString *string = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
//---------上面是轉(zhuǎn)字符串-----下面下載小文件-------------------------------
// 緩存文件夾
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
// 文件路徑
NSString *file = [caches stringByAppendingPathComponent:@"minion_15.mp4"];
// 寫入數(shù)據(jù)
[self.fileData writeToFile:file atomically:YES];
self.responseData = nil;
/**-------------------------------下載大文件-------------------------------**/
if (0) {
    // 關(guān)閉handle
    [self.handle closeFile];
    self.handle = nil;
    // 清空長度
    self.currentLength = 0;
} else{//關(guān)閉數(shù)據(jù)流
          [self.stream close];
         }

}

  • 請求失斚宦拧(比如請求超時)
    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
NSLog(@"didFailWithError -- %@", error);

}

post請求

-(void)postConnection{

// 1.請求路徑
NSString *urlStr = @"http://www.baidu.com/login?username=登陸&pwd=";
// 將中文URL進(jìn)行轉(zhuǎn)碼
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
// 2.創(chuàng)建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 更改請求方法
request.HTTPMethod = @"POST";
// 設(shè)置請求體
request.HTTPBody = [@"username=&pwd=" dataUsingEncoding:NSUTF8StringEncoding];
// 設(shè)置超時(5秒后超時)
request.timeoutInterval = 5;
// 設(shè)置請求頭
//    [request setValue:@"iOS 9.0" forHTTPHeaderField:@"User-Agent"];
// 3.發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    if (connectionError) { // 比如請求超時
        NSLog(@"----請求失敗");
    } else {
        NSLog(@"------%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }
}];

} ////

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末封救,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捣作,更是在濱河造成了極大的恐慌誉结,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件券躁,死亡現(xiàn)場離奇詭異惩坑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)也拜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門以舒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慢哈,你說我怎么就攤上這事蔓钟。” “怎么了卵贱?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵滥沫,是天一觀的道長。 經(jīng)常有香客問我艰赞,道長佣谐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任方妖,我火速辦了婚禮狭魂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘党觅。我一直安慰自己雌澄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布杯瞻。 她就那樣靜靜地躺著镐牺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魁莉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天痹束,我揣著相機(jī)與錄音,去河邊找鬼讶请。 笑死祷嘶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夺溢。 我是一名探鬼主播论巍,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼风响!你這毒婦竟也來了嘉汰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤钞诡,失蹤者是張志新(化名)和其女友劉穎郑现,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朵诫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年辛友,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剪返。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡废累,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钱反,到底是詐尸還是另有隱情掖看,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布面哥,位于F島的核電站哎壳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尚卫。R本人自食惡果不足惜归榕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吱涉。 院中可真熱鬧刹泄,春花似錦外里、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至县匠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撒轮,已是汗流浹背乞旦。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留题山,地道東北人兰粉。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像顶瞳,于是被迫代替她去往敵國和親玖姑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容