您的位置:首页 > 理论基础 > 计算机网络

网络请求(NSURLConnection)

2016-04-18 09:03 148 查看
4000

http和https
URL全称是Uniform Resource
Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源

URL就是资源的地址,位置,互联网上的每个资源都有一个唯一的URL

URL的基本格式=
协议://主机地址/路径

协议:不同的协议,代表着不同的资源查找方式,资源传输方式{ftp://(文件传输协议), http://(超文本传输协议), https://(安全超文本传输协议), file:// (本地文件协议)
}

主机地址:存放资源的主机的IP地址(地域)

路径:资源在主机的位置

HTTP协议, Hyper Transfer Protocol
(超文本传输协议)
是用于万维网(WWW)服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.

工作原理: HTTP协议采用请求/响应模型.
客户端向服务器发送一个请求报文,服务器以一个状态作为响应.

HTTPS: 安全超文本传输协议
它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息.它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版.
HTTPS协议使用SSL在发送方和接受方通过交换共知的秘钥来实现.因此,传送的数据不容易被网络黑客截取和解密.

SSL是Netscape公司所提出的安全保密协议,在浏览器和web服务器之间构造安全通道来进行数据传输,SSL运行TCP/IP
层值上,应用层之下,为应用程序提供加密数据通道.

异同: 

https协议需要到ca申请证书,一般免费证书很少,需要交费

http是超文本传输协议,信息是明文传输,https则是具有安全性的加密传输协议

http和https是用的是完全不同的链接方式,用的端口也不一样,前者是后者是443

http的链接很简单,是无状态的

https是协议是由SSL + HTTP
协议构建的可进行加密传输,身份认证的网络协议 要比http安全

请求方式: GET 和 POST ;

连接方式: 
同步连接:程序容易出现卡死现象

异步链接:等待数据返回

异步连接有两种实现方式: 
设置代理,接收数据

实现block

注意  
  网络请求,允许

Http
请求

    

NSAppTransportSecurity 类型 Dictionary
下添加 

    
NSAllowsArbitraryLoads
类型
Boolean ,值设为 
YES

 

  

同步GET

创建一个地址字符串,注意: 不要有空格

创建一个统一资源定位符(URL)

创建一个NSURLRequest,并配置缓存策略和超时时间

通过一个NSData对象获取网络请求的数据

同步POST:
创建一个地址字符串,注意: 不要有空格

创建一个统一资源定位符

使用NSMutableURLRequest.
因为之后要对request做更改

创建一个上传数据的字符串,并且转成NSData对象

设置请求方式
(setHTTPMethod)

设置上传的Data(setHTTPBody)

通过一个NSData对象获取网络请求的数据

POST和GET的区别: 
POST设置请求方式

GET设置Body

同步GET和POST的缺点:
会造成程序的卡顿,所以在开发中不推荐使用

[b]
//get[b]同步
[/b][/b]

-
(IBAction)getT:(id)sender
{

   

//地址字符串

   

NSString *urlString
=
@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";

   
//统一资源定位符

(URL) 

   

NSURL *url
= [NSURL

URLWithString:urlString];

 
  //创建网络请求
(通过URL)

   

//参数

1:
统一资源定位符

   
//参数

2:
缓存协议(策略)

   

//参数

3:
有效时间(超出时间)

   

NSURLRequest *request
= [NSURLRequest

requestWithURL:url

cachePolicy:(NSURLRequestReloadIgnoringLocalCacheData)

timeoutInterval:60.0f];

   

   
//连接服务器,接收数据

   

//NSURLConnection
在9.0之后不推荐使用

   

//参数

1 : NSURLRequest
类型的对象

   

//参数

2 :
存储的是一些网络请求的信息,一般为nil

   
//参数

3 :
错误信息

 
 
NSData *data
= [NSURLConnection

sendSynchronousRequest:request

returningResponse:nil

error:nil];

   

NSLog(@"%@",data);

   

//解析数据

   

NSDictionary *dict
= [NSJSONSerialization

JSONObjectWithData:data

options:(NSJSONReadingAllowFragments)

error:nil];

   

   

NSLog(@"%@",dict);

   

}

[b]
//post[b]同
[/b][/b]

-
(IBAction)postT:(id)sender
{

 
  //创建URL

   

NSString *string
=
@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";

   

NSURL *url
= [NSURL

URLWithString:string];

 
  //创建请求

   

NSMutableURLRequest *request
= [NSMutableURLRequest

requestWithURL:url];

   

NSString *dataString
=
@"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";

   

//把这个字符串转成NSData类型的对象

   

NSData *postData
= [dataString
dataUsingEncoding:

NSUTF8StringEncoding];

   
//设置请求方式

(大写)

如:
POST(必须要设置)
GET(可以不设置,因为默认是GET)

   
[request
setHTTPMethod:@"POST"];

   

//需要把上传的data放进request里面

   
[request
setHTTPBody:postData];

   
//连接服务器

   

NSData *data
= [NSURLConnection

sendSynchronousRequest:request

returningResponse:nil

error:nil];

   

//解析数据

   

NSDictionary *dict
= [NSJSONSerialization

JSONObjectWithData:data

options:(NSJSONReadingAllowFragments)

error:nil];

   

NSLog(@"%@",dict);

   

}

异步

#import
"ViewController.h"

@interface
ViewController ()<</span>NSURLConnectionDataDelegate>//遵循代理

@property
(nonatomic,

strong)

NSMutableData *resultData;

@end

[b]
//get[b]异步
[/b][/b]

-
(IBAction)getY:(id)sender
{

   

//通过地址字符串,创建url

   

NSString *urlString
=
@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";

   

NSURL *url
= [NSURL

URLWithString:urlString];

   

//通过url,创建请求

   
NSURLRequest *request
= [NSURLRequest

requestWithURL:url];

#pragma mark -----block

   

//调用带有block回调的方法,执行网络请求

   

//参数

1: NSURLRequest

   

//参数

2: block块里面的代码在哪个线程执行

   
[NSURLConnection

sendAsynchronousRequest:request

queue:[NSOperationQueue

mainQueue]

completionHandler:^(NSURLResponse
*

_Nullable response,

NSData *

_Nullable data,

NSError *

_Nullable connectionError)
{

       

//respone
携带的是借口的一些信息

       

//data   

请求下来的数据信息(需要使用的)

       

//connectionError
错误信息

       

if (connectionError
==
nil)
{

           

NSDictionary *dict
= [NSJSONSerialization

JSONObjectWithData:data

options:(NSJSONReadingAllowFragments)

error:nil];

           

NSLog(@"%@",dict);

           

//这里应该刷新UI了

           

//1 :
给数据源数组赋值

           

//2 :
赋值结束之后,刷新UI
([[self.tableView reloadData])

           
//原则

:
主线程只负责更新UI 

       
}

   
}];

#pragma mark -----代理

 
 
//代理的异步网络请求(GET)

   

//参数

1: NSURLRequest

   

//参数

2:代理

   
[NSURLConnection

connectionWithRequest:request

delegate:self];

}

[b]//post[b]异步[/b][/b]

-
(IBAction)postY:(id)sender
{

   

//通过地址字符串,创建url

   

NSString *urlString
=
@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";

   

NSURL *url
= [NSURL

URLWithString:urlString];

   

//通过url,创建请求

   

NSMutableURLRequest *request
= [NSMutableURLRequest

requestWithURL:url];

   

   

//因为POST通过data给服务器传输数据,所有通过string创建data

   

NSString *dataString
=
@"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";

   

NSData *postData
= [dataString
dataUsingEncoding:NSUTF8StringEncoding];

   

//设置请求方式

   
[request
setHTTPMethod:@"POST"];

   

//设置body,

   
[request
setHTTPBody:postData];
#pragma
mark ----block

   
[NSURLConnection

sendAsynchronousRequest:request

queue:[NSOperationQueue

mainQueue]

completionHandler:^(NSURLResponse
*

_Nullable response,

NSData *

_Nullable data,

NSError *

_Nullable connectionError)
{   
   

       

NSDictionary *dict
= [NSJSONSerialization

JSONObjectWithData:data

options:(NSJSONReadingAllowFragments)

error:nil];

       

NSLog(@"%@",dict);

   
}];

#pragma mark ----代理
   
[NSURLConnection

connectionWithRequest:request

delegate:self];

   

}

#pragma
mark 
-----NSURLConnectionDataDelegate协议方法

//开始响应

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

   

//初始化保存结果的data

   

self.resultData
=
[NSMutableData

data];

}
//接收到数据
//这个方法会重复的执行,所以可能拿到一段一段的数据.这就是需要我们把这些数据拼接起来

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

   

//为了防止

拿到的数据不全,所以把拿到的数据拼接到保存结果的data中.

   
[self.resultData

appendData:data];

}
//结束响应

- (void)connectionDidFinishLoading:(NSURLConnection
*)connection{

   

//

   

NSDictionary *dict
= [NSJSONSerialization

JSONObjectWithData:self.resultData

options:(NSJSONReadingAllowFragments)

error:nil];

   

NSLog(@"异步代理

---> %@",dict);

   

//更新数据源数组

   

//刷新UI

}

@end

Policy n. 政策,方针;保险单

Interval n.
间隔;间距;

Synchronous adj. 同步的;同时的

Fragments n. 碎片(fragment的复数);片断;[计]
分段

Method n.
方法;条理

 Asynchronous adj.
[电] 异步的;不同时的

Operation n. 操作;经营;[外科] 手术;[数][计]
运算

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