這篇文章主要是一些基礎(chǔ)的知識:
包括:GET請求院水、POST請求、同步請求焙压、異步請求
1忆家、請求的一般步驟
1.確定地址NSURL
2.建立請求NSURLRequest
3.建立并啟動鏈接NSURLConnection
4.遵守協(xié)議NSURLConnectionDataDelegate
這就是請求的節(jié)本步驟
同步請求和異步請求
同步請求和異步請求的比較:
同步請求:比如一夫當(dāng)關(guān)萬夫莫開的地方要用同步請求(登錄)。
異步請求:程序阻塞主線程會影響用戶體驗全蝶,比如tableview加載時同時加載圖片闹蒜,在網(wǎng)速慢的情況下會阻塞其他加載項,圖片可以后續(xù)加載(凡是可以向后拖得抑淫,不是那么重要的事绷落,就可以使用異步加載)。
POST和GET請求
區(qū)別主要在:
POST&GET.png
google去吧一堆一堆的J嘉F鏊浮!
同步請求實例
同步請求在網(wǎng)絡(luò)慢的情況下會阻塞線程。
//主要代碼
NSURLResponse *response = nil;
NSError *error = nil;
//同步操作沒有執(zhí)行完成 后面的代碼不會執(zhí)行
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
異步請求
//異步請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if(data != nil){
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@---async",str);
}else if(data == nil && connectionError == nil){
NSLog(@"接收到空數(shù)據(jù)async");
}else{
NSLog(@"%@",connectionError.localizedDescription);
}
}];
NSLog(@"請求不完成也會執(zhí)行執(zhí)行這里:怼避归!");
GET請求
//1.確定地址NSURL
NSString *urlString = [NSString stringWithFormat:@"http://localhost/01/index.php?username=%@&password=%@",username,password];
//1.1提示 URL中如果包含中文字符 需要轉(zhuǎn)換成帶%的格式。
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//1.2 在ios開發(fā)中 如果沒有意外使用utf8的格式
NSURL *url = [NSURL URLWithString:urlString];
//2.建立請求NSURLRequest
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.建立并啟動鏈接NSURLConnection
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//啟動連接管呵。異步連接請求
[conn start];
self.serverData = [NSMutableData data];
POST請求
//1.確定地址NSURL
NSString *urlString = [NSString stringWithFormat:@"http://localhost/01/index.php"];
//1.2 在ios開發(fā)中 如果沒有意外使用utf8的格式
NSURL *url = [NSURL URLWithString:urlString];
//2.建立請求NSURLRequest(psot)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//2.1請求方式
[request setTimeoutInterval:2.0f];
[request setHTTPMethod:@"POST"];
//2.2數(shù)據(jù)體(POST 請求中創(chuàng)建數(shù)據(jù)體時如果有中文 不需要轉(zhuǎn)碼梳毙,因為NSUTF8StringEncoding 已經(jīng)實現(xiàn)了轉(zhuǎn)碼)
NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@",username,password];
//將nsstring轉(zhuǎn)換為nsdata
NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",body);
[request setHTTPBody:body];
//3.建立并啟動鏈接NSURLConnection
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//啟動連接。異步連接請求
[conn start];
self.serverData = [NSMutableData data];
代理方法
遵守代理 NSURLConnectionDataDelegate
@interface MainViewController () <NSURLConnectionDataDelegate>
#pragma mark - 網(wǎng)絡(luò)代理方法
#pragma mark 1.接受服務(wù)器的響應(yīng)捐下,服務(wù)器要傳數(shù)據(jù)顿天,客戶端做接受準(zhǔn)備
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//服務(wù)器通知準(zhǔn)備
//實例化
}
#pragma mark 2.接收服務(wù)器傳輸?shù)臄?shù)據(jù),可能多次執(zhí)行
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//每次傳輸?shù)臄?shù)據(jù)進行拼接
[self.serverData appendData:data];
}
#pragma mark 3.接收數(shù)據(jù)完成 蔑担, 做后續(xù)處理
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//對方法二的拼接數(shù)據(jù)進行后續(xù)處理 需要中轉(zhuǎn)數(shù)據(jù)
}
#pragma mark 4.服務(wù)器請求失敗(網(wǎng)絡(luò)環(huán)境等等)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"連接錯誤:%@",error.localizedDescription);
}
#pragma mark 5.向服務(wù)器發(fā)送數(shù)據(jù)牌废,此方法僅適用于post,尤其上傳文件
- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
NSLog(@"發(fā)送數(shù)據(jù)給服務(wù)器");
}
NSURLConnection 提供了來那個靜態(tài)方法啤握,可以直接同步或者異步調(diào)用NSURLRequest鸟缕,而無需通過NSURLConnectionDataDelegate代理獲取數(shù)據(jù)。
做個筆記一起學(xué)習(xí)....