标签:
一、网络基础
1、URL
URL的全称是Uniform Resource Locator(统一资源定位符)
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL
URL的基本格式 = 协议://主机地址/路径
http://10.2.88.9/ios/img.png
2、C/S模式(客户端/服务器模式)
Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将?户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显?给?户;Server程序的任务是接收客户程序提出的服务请求,进?相应的处理,再将结果返回给客户程序
3、URL中常见的协议
HTTP
超文本传输协议(Hypertext Transfer Protocol),访问的是远程的网络资源,格式是http://
http协议是在网络开发中最常用的协议
规定客户端和服务器之间的数据传输格式
file
访问的是本地计算机上的资源,格式是file://(不用加主机地址)
mailto
访问的是电子邮件地址,格式是mailto:
FTP
访问的是共享主机的文件资源,格式是ftp://
3.1 HTTP请求
HTTP协议特点
协议简单,服务器的程序规模小,通信速度很快
HTTP允许传输任意类型的数据
限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间
HTTP通信过程
1. 建立TCP连接
HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
2. Web浏览器向Web服务器发送请求命令
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。
3. Web浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
4. Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
5. Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
6. Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
7. Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive。TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
请求
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
请求行:包含了请求方法、请求资源路径、HTTP协议版本
GET /MJServer/resources/images/1.jpg HTTP/1.1
请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息
Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0 // 客户端的类型,客户端的软件环境
Accept: text/html, */* // 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式
请求体:客户端发给服务器的具体数据,比如文件数据
响应
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
HTTP协议规定:1个完整的HTTP响应中包含以下内容
状态行:包含了HTTP协议版本、状态码、状态英文名称
HTTP/1.1 200 OK
响应头:包含了对服务器的描述、对返回数据的描述
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
实体内容:服务器返回给客户端的具体数据,比如文件数据
图示
3.2 发送HTTP请求的方法
在HTTP/1.1协议中,定义了8种发送http请求的方法
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
PUT :增
DELETE :删
POST:改
GET:查
最常用的是GET和POST(实际上GET和POST都能办到增删改查)
3.3 GET和POST对比
GET和POST的主要区别表现在数据传递上
GET
在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
http://ww.test.com/login?username=123&pwd=234&type=JSON
由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
POST
发给服务器的参数全部放在请求体中
理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
选择GET和POST的建议
如果要传递大量数据,比如文件上传,只能用POST请求
GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
如果仅仅是索取数据(数据查询),建议使用GET
如果是增加、修改、删除数据,建议使用POST
二、iOS实现网络编程
1、NSURLConnection常用类
NSURL:请求地址
NSURLRequest:一个NSURLRequest对象就代表一个请求,它包含的信息有
一个NSURL对象
请求方法、请求头、请求体
请求超时
… …
NSMutableURLRequest是NSURLRequest的子类,常用设置有
timeoutInterval :请求超时等待时间(超过这个时间就算超时,请求失败)
HTTPMethod :请求方法(比如GET和POST)
HTTPBody :请求体
设置请求头:- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
NSURLConnection
负责发送请求,建立客户端和服务器的连接
发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据
1.1 NSURLConnection使用步骤
创建一个NSURL对象,设置请求路径
传入NSURL创建一个NSURLRequest对象,设置请求头和请求体
使用NSURLConnection发送NSURLRequest
1.2 NSURLConnection发送请求
NSURLConnection常见的发送请求方法有以下几种
同步请求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
异步请求
根据对服务器返回数据的处理方式的不同,又可以分为2种
block回调
+ (void)sendAsynchronousRequest:(NSURLRequest*)request
queue:(NSOperationQueue*)queue
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError))handler;
代理
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
在startImmediately = NO的情况下,需要调用start方法开始发送请求
- (void)start;
成为NSURLConnection的代理,最好遵守NSURLConnectionDataDelegate协议
1.3 NSURLConnectionDelegate
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;
将要发送网络请求
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
2、GET和POST请求
2.1 同步\异步GET
通过URL请求图片,查看同步与异步请求的不同效果
同步(不用设置代理)
//1.网址对象(NSURL)
NSURL *url = [NSURL URLWithString:@"http://image.zcool.com.cn/56/13/1308200901454.jpg"];
//2.请求对象(NSMutableURLRequest)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//3.创建连接对象(NSURLConnection),并发送请求
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (data) {
_imgView.image = [UIImage imageWithData:data];
}
异步(需要设置代理)
//1.网址对象(NSURL)
NSURL *url = [NSURL URLWithString:@"http://image.zcool.com.cn/56/13/1308200901454.jpg"];
//2.请求对象(NSMutableURLRequest)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//3.网络连接对象(NSURLConnection)
[NSURLConnection connectionWithRequest:request delegate:self];
#pragma mark -- NSURLConnectionDataDelegate --
//将要发送网络请求
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
return request;
}
//服务器已经开始响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
self.receiveData = [NSMutableData data];
_value = response.expectedContentLength;
}
//已经接收数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//拼接data
[_receiveData appendData:data];
_progressView.progress = _receiveData.length/(float)_value;
self.imgView.image = [UIImage imageWithData:_receiveData];
}
2.2 同步/异步POST
使用JSON解析请求的内容并将部分内容显示,synPOST:和asynPOST:分别为同步、异步POST按钮,将内容显示在UITextView中
#define BASE_URL_2 @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"
#pragma mark -- 同步连接下的POST请求 --
- (IBAction)synPOST:(UIButton *)sender {
//1.网址对象(NSURL)
NSURL *url = [NSURL URLWithString:BASE_URL_2];
#warning mark--创建请求对象(请求对象是可变的)
//2.创建请求对象(NSMutableURLRequest)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//3.设置请求方式(如果没设置请求方式,默认是GET)
[request setHTTPMethod:@"POST"];
//4.设置请求体(将请求参数转换为NSData放入请求体)
NSData *data = [BASE_URL_2_PARAM dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//5.创建连接并发送请求
NSData *dataReceive = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//6.解析数据
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:dataReceive options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dict);
self.newsArray = [NSMutableArray array];
NSArray *array = [dict objectForKey:@"news"];
for (NSDictionary *dic in array) {
NewsItem *item = [[NewsItem alloc] init];
[item setValuesForKeysWithDictionary:dic];
[_newsArray addObject:item];
}
self.textView.text = [_newsArray[0] cname];
}
#pragma mark -- 异步连接下的POST请求(代理-协议,block) --
- (IBAction)asynPOST:(UIButton *)sender {
//1.网址对象(NSURL)
NSURL *url = [NSURL URLWithString:BASE_URL_2];
#warning mark--创建请求对象(都是可变的NSMutableURLRequest)
//2.创建对象
/*
NSURLRequestUseProtocolCachePolicy 0 ,默认的缓存策略,如果缓存不存在,直接到服务器上去请求数据。如果存在,直接到本地缓存取(会根据response中的Cache-Control字段来判断执行什么操作)
NSURLRequestReloadIgnoringLocalCacheData 1 ,忽略本地缓存数据,重新到服务器上请求数据
NSURLRequestReloadIgnoringLocalAndRemoteCacheData 4,忽略本地缓存和代理服务器上的缓存数据,重新到服务器上请求数据
NSURLRequestReturnCacheDataElseLoad 2 ,有缓存就使用(不管缓存是否有效),没有缓存就去服务器请求
NSURLRequestReturnCacheDataDontLoad 3 ,只从缓存使用
*/
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
//3.设置请求方式
[request setHTTPMethod:@"POST"];
//实现异步连接--delegate
//4.设置请求体
NSData *data = [BASE_URL_2_PARAM dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
//5.创建连接并发送请求
[NSURLConnection connectionWithRequest:request delegate:self];
//实现异步连接--block
// NSOperationQueue *queue = [NSOperationQueue mainQueue]; //一般直接获取,不创建
// __block SecondViewController *secondVC = self;
//5.[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// //block中的内容,当传输完毕执行。data为总数据
// if (data) {
// NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
// NSArray *array = dict[@"news"];
// secondVC.newsArray = [NSMutableArray array];
// for (NSDictionary *dic in array) {
// NewsItem *item = [[NewsItem alloc] init];
// [item setValuesForKeysWithDictionary:dic];
// [secondVC.newsArray addObject:item];
//// [item release];
// }
// secondVC.textView.text = [secondVC.newsArray[0] cname];
//
// }
// }];
}
#pragma mark -- NSURLConnectionDataDelegate --
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
self.receiveData = [NSMutableData data];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_receiveData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if (_receiveData) {
//解析数据
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:_receiveData options:NSJSONReadingMutableContainers error:nil];
NSArray *array = dict[@"news"];
self.newsArray = [NSMutableArray array];
for (NSDictionary *dic in array) {
NewsItem *item = [[NewsItem alloc] init];
[item setValuesForKeysWithDictionary:dic];
[_newsArray addObject:item];
}
self.textView.text = [_newsArray[0] cname];
}
}
3、Charles
什么是Charles
Charles是一款代理服务器软件,可以用来拦截网络请求
利用Charles能得知大部分公司app的数据来源和数据格式
下载地址:http://www.charlesproxy.com/download/
标签:
原文地址:http://my.oschina.net/zooyf/blog/502665