您的位置:首页 > 产品设计 > UI/UE

UI第十六天:⺴络编程

2015-12-03 19:18 633 查看
⼀、HTTP协议的概念
HTTP协议,Hyper Text Transfer Protocol(超⽂本传输协议)是 ⽤于从万维⺴服务器传送超⽂本到本地浏览器的传输协议,HTTP是 ⼀个应⽤层协议,由请求和响应构成,是⼀个标准的客户端服务器 模型。
Client和Server常常分别处在相距很远的两台计算机上,Client程序的 任务是将⽤户的要求提交给Server程序,再将Server程序返回的结果以 特定的形式显⽰给⽤户;Server程序的任务是接收客户程序提出的服务 请求,进⾏相应的处理,再将结果返回给客户程序

⼆、iOS平台如何实现HTTP协议请求
⺴络请求地址对象NSURL的作⽤及⽤法
⺴络请求对象NSURLRequest、NSMutableURLRequest的作⽤及⽤法
⺴络链接对象NSURLConnection的作⽤及⽤法
⺴络链接协议NSURLConnectionDelegate的作⽤及⽤法
⺴络请求数据信息NSURLResponse的作⽤及⽤法

url,统⼀资源定位符,也被称为⺴址,因特⺴上标准的资源⺴址
⼀个典型的url:http://lily:123456@www.google.com/search? hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page

url的符语法: 协议://授权/路径?查询
协议:ftp://(⽂件传输协议) http://(超⽂本传输协议) https://(安全超文本传输协议) file://(本地文件协议)

url作为网址字符串包含很多请求参数,NSURL对网址字符串进行封装, 可以使用NSURL对象获取相应的参数。
absoluteString: http://lily:123456@www.google.com/search? hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10#page

scheme: http
host: www.google.com
user: lily
password: 123456
port: 8080
query: hl=en&source=hp&q=mysql&aq=f&oq=&aqi=g10

三、服务器接⼝的简单介绍
相同点:都能给服务器传输数据
不同点:
1、给服务器传输数据的⽅式: GET:通过⺴址字符串。 POST:通过data
2、传输数据的⼤⼩: GET:⺴址字符串最多255字节。 POST:使⽤NSData,容量超过1G
3、安全性: GET:所有传输给服务器的数据,显⽰在⺴址⾥,类似于密码的明⽂输⼊,直接可⻅。 POST:数据被转成NSData(⼆进制数据),类似于密码的密⽂输⼊,⽆法直接读取。
同步连接:程序容易出现卡死现象
异步连接:等待数据返回。
异步联接有两种实现⽅式:
设置代理,接收数据
实现block

同步连接
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
异步连接(代理)
设置NSURLConnection代理
实现相应的代理⽅法:开始响应接收数据、接收数据、成功、失败
- (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
异步连接(block)
+ (void)sendAsynchronousRequest:(NSURLRequest*)request
queue:(NSOperationQueue*)queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError))handler

NSURLResponse
根据⺴络请求协议,封装了服务器返回数据的部分信息。服务器 响应⺴络请求后,返回数据的部分信息及数据本⾝。
expectedContentLength
suggestedFilename
MIMEType
textEncodingName
URL

NSHTTPURLResponse
NSURLResponse的⼦类,封装有关HTTP协议的响应信息。存储 了HTTP协议的响应头信息,状态码。
allHeaderFields
statusCode
如果⺴络请求时使⽤HTTP协议,NSURLResponse就是 NSHTTPURLResponse
总结
GET请求⽅式、POST是请求⽅式 同步、异步是连接⽅式 ⺴络请求的步骤:1、NSURL;2、NSURLRequest;3、 NSURLConnection;4、处理Error或者返回数据

//
注意:当这个页面被销毁的时候
如果请求还没有完成
需要终止这个链接
[_connection
cancel];
//同步请求会造成程序的卡顿(只有当请求完成
才会回复对界面的操作
用户的体验很差)

-(void)get:(UIBarButtonItem
*)bar

{

//注意如果网址中有中文要转换格式

NSString *newStr = [kSearchURL
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//转换一下编码格式

// NSString *new = [kSearchURL stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

//把字符串的网址转换成网址对象

NSURL *url =[NSURL
URLWithString:newStr];

//创建一个请求

//timeoutInterval
请求超时的时间
秒为单位

NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10];

// 设置一个请求标识

// 注意加标识符很重要

[request setHTTPMethod:@"get"];

//利用这个请求创建一个链接

//创建空的服务器响应信息

NSURLResponse *response =
nil;

//建立同步连接
并且得到返回的数据(data);

NSData *data = [NSURLConnection
sendSynchronousRequest:request
returningResponse:&response
error:nil];

//解析数据

NSMutableDictionary *dic = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:nil];

NSLog(@"%@",dic);

}

// 异步请求

-(void)post:(UIBarButtonItem *)bar

{

// 获取网址对象(中文要转码)

NSString *urlStr = [kSearchURL
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//利用网址创建网址对象

NSURL *url = [NSURL
URLWithString:urlStr];

//利用网址对象创建请求

NSMutableURLRequest *request = [[NSMutableURLRequest
alloc]initWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10];

//标识请求类型

// 注意加标识符很重要

[request setHTTPMethod:@"Get"];

#pragma mark -- block
异步链接方法

//[NSOperationQueue mainQueue]代表回到主线程

[NSURLConnection
sendAsynchronousRequest:request
queue:[NSOperationQueue
mainQueue]
completionHandler:^(NSURLResponse *response,
NSData *data,
NSError *connectionError) {

//当数据完成的时候
会指定这个block

NSMutableDictionary *dic = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:&connectionError];

NSLog(@"%@",dic);

// 判断是否在主线程

NSLog(@"%d",[NSThread
isMainThread]);

}];

#pragma mark -- 代理方法

//利用请求创建一个异步连接

// self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

// [self.connection start];

}

- (void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response

{

self.data = [NSMutableData
data];

NSLog(@"已经接受到服务器的响应信息,说明链接成功了");

NSLog(@"%@",response);

}

- (void)connection:(NSURLConnection *)connection
didReceiveData:(NSData *)data

{

//可能多次触发这个方法才能接收到完整的data

//所有这个时候
需要拼接一下data

//拼接data

[self.data
appendData:data];

NSMutableDictionary *dic = [NSJSONSerialization
JSONObjectWithData:self.data
options:NSJSONReadingMutableContainers
error:nil];

NSLog(@"%@",dic);

// 如果在tableview上展示的话

//注意:要刷新界面

NSLog(@"接受到数据触发的方法");

}

- (void)connectionDidFinishLoading:(NSURLConnection
*)connection

{

NSLog(@"完成数据加载
触发的方法");

}

- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error

{

NSLog(@"请求失败时打印%@",error);

}

- (void)didReceiveMemoryWarning {

[super
didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.
}

//post同步

-(void)get:(UIBarButtonItem *)bar

{

//创建网址对象

NSURL *url = [NSURL URLWithString:kNewsListURL];

//创建一个请求

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

// 注意加标识符

// 为了看到清楚添加标识

[request setHTTPMethod:@"post"];

//把字符串转成data(使用utf-8编码格式)

NSData *data =[kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];

//注意区别Post
请求可以携带一个请求体

[request setHTTPBody:data];

// 创建链接

NSData *newdata = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:newdata options:NSJSONReadingMutableContainers error:nil];

NSLog(@"%@",dic);

}

//post异步

-(void)post:(UIBarButtonItem *)bar

{

//创建网址对象

NSURL *url = [NSURL URLWithString:kNewsListURL];

//创建一个请求

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

// 为了看到清楚添加标识

[request setHTTPMethod:@"post"];

//把字符串转成data(使用utf-8编码格式)

NSData *data =[kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];

//注意区别Post
请求可以携带一个请求体

[request setHTTPBody:data];

// [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

// NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

// NSLog(@"%@",dic);

//

//

// }];

self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

[self.connection start];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: