网络请求(NSURLConnection)

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 层值上,应用层之下,为应用程序提供加密数据通道.
网络请求(NSURLConnection)
  • 异同: 
  1. https协议需要到ca申请证书,一般免费证书很少,需要交费
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的加密传输协议
  3. http和https是用的是完全不同的链接方式,用的端口也不一样,前者是后者是443
  4. http的链接很简单,是无状态的
  5. https是协议是由SSL + HTTP 协议构建的可进行加密传输,身份认证的网络协议 要比http安全

请求方式: GET 和 POST ;
网络请求(NSURLConnection)
连接方式: 
  1. 同步连接:程序容易出现卡死现象
  2. 异步链接:等待数据返回
异步连接有两种实现方式: 
  1. 设置代理,接收数据
  2. 实现block

  • 注意     网络请求,允许 Http 请求
     NSAppTransportSecurity 类型 Dictionary 下添加  
     NSAllowsArbitraryLoads 类型 Boolean , 值设为   YES
 
  
同步GET : 
  1. 创建一个地址字符串,注意: 不要有空格
  2. 创建一个统一资源定位符(URL)
  3. 创建一个NSURLRequest,并配置缓存策略和超时时间
  4. 通过一个NSData对象获取网络请求的数据

同步POST:
  1. 创建一个地址字符串,注意: 不要有空格
  2. 创建一个统一资源定位符
  3. 使用NSMutableURLRequest. 因为之后要对request做更改
  4. 创建一个上传数据的字符串,并且转成NSData对象
  5. 设置请求方式 (setHTTPMethod)
  6. 设置上传的Data(setHTTPBody)
  7. 通过一个NSData对象获取网络请求的数据
POST和GET的区别: 
  1. POST设置请求方式
  2. GET设置Body
同步GET和POST的缺点: 会造成程序的卡顿,所以在开发中不推荐使用

//get同步

- ( 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);
   
}

//post

- ( 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

//get异步
- ( 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 ];
}

//post异步
- (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. 队列;长队;辫子

你可能感兴趣的:(网络请求(NSURLConnection))