iOS入门-37NSURLSession网络数据请求

概述

iOS中网络数据请求。

主要涉及的类

  • NSURLRequest
  • NSURLSession
  • NSURLSessionDataTask
  • NSURLSessionConfiguration

本文只是一个简单的展示get和post请求的示例,将基本的操作包含其中。
如果想要深入了解如何配置网络请求框架还需要了解网络部分的相关知识,iOS中都有相应的api。

配置http可以使用

iOS 9.0由于强制使用https , 所以之前使用的 http的连接 的应用如果不做特殊配制就都不可以运行了,为了解决这个问题要在工程的info.plit中添加如下配制。
在这里插入图片描述

示例

简单的get和post请求,点击两个按钮进行相应的请求。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //创建俩按钮,点击分别进行get请求,post请求
    UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    btn.frame = CGRectMake(50, 50, 80,40);
    
    [btn setTitle:@"GET请求" forState:UIControlStateNormal];
    
    [btn addTarget:self action:@selector(loadDataByGet) forControlEvents:UIControlEventTouchUpInside];
    
    UIButton* btn01 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    btn01.frame = CGRectMake(50, 150, 80, 40);
    
    [btn01 setTitle:@"POST请求" forState:UIControlStateNormal];
    
    [btn01 addTarget:self action:@selector(loadDataByPost) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:btn];
    
    [self.view addSubview:btn01];
}

-(void)loadDataByGet{
    //字符串网址(可能包含get请求需要的参数)
    NSString* urlStr = @"你的请求url";
    //将字符串网址转化为一个地址连接对象
    NSURL* url = [NSURL URLWithString:urlStr];
    //创建一个连接请求对象
    //里面封装了请求信息,发向目的地址
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    //创建会话对象
    NSURLSession* session = [NSURLSession sharedSession];
    //创建回话任务对象
    //分两种方法
    //方法一:
    //p1:请求对象
    //p2:完成之后处理函数。其中包含了,data:响应体数据(我们要的json);response:响应头信息;error:请求失败的话,错误信息
//    NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//
//    NSLog(@"dicRoot==%@",dicRoot);
//
//    NSLog(@"response==%@",response);
//
//    NSLog(@"error==%@",error);
//    }];
    
    //方法二
    //该方法内部会自动将请求路径包装成一个请求对象,该请求对象默认包含了请求头信息和请求方法(GET)
    //如果要发送的是POST请求,则不能使用该方法
    NSURLSessionDataTask* dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //json解析根字典
        NSDictionary* dicRoot = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        
        //打印返回数据
        
        NSLog(@"dicRoot==%@",dicRoot);
        
        NSLog(@"response==%@",response);
        
        NSLog(@"error==%@",error);
        
    }];
    
    //执行
    [dataTask resume];
    
}

-(void) loadDataByPost {
    //字符串网址
    NSString* urlStr = @"你的请求url";
    //将字符串网址转化为一个地址连接对象
    NSURL* url = [NSURL URLWithString:urlStr];
    //请求对象
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
    
    //post请求,参数添加到请求体中
    request.HTTPMethod = @"POST";
    //post请求三个参数,name和age和jf
    NSString *name = @"lilei";
    NSString *age = @"12";
    NSString *jf = @"1";
    NSString *bodyDataString = [NSString stringWithFormat:@"name=%@&age=%@&jf=%@", name, age,jf];
    //创建请求体对象并赋值;请求体对象使用的是UTF8编码
    request.HTTPBody = [bodyDataString dataUsingEncoding:NSUTF8StringEncoding];
    
    //初始化会话配置对象
    NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
    //配置请求头(一些统一配置的参数放头里):系统为iOS,返回数据要求json
    config.HTTPAdditionalHeaders = @{
    @"os"       : @"iOS",
    @"Content-Type"  : @"application/json"
    };
    //创建会话对象
    //p1:会话配置对像
    NSURLSession* session = [NSURLSession sessionWithConfiguration:config];
    //创建会话任务
    NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //打印返回数据
        //json解析根字典
         NSDictionary* dicRoot = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        
        NSLog(@"dicRoot==%@",dicRoot);
        
        NSLog(@"response==%@",response);
        
        NSLog(@"error==%@",error);
    }];
    
    [task resume];
}

@end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章