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

UI_17 网络编程

2015-09-08 10:49 267 查看
一、网络基础

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://www.open-open.com/lib/view/open1390612571836.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: