iOS开发--网络请求

网络请求

1.发送请求
url: = 网络协议(http://今后可能是https) +文件路径? + 参数1&参数2.....

2.接收响应

3.创建连接对象传输数据
Xcode7之后若想要使用http,需要修改info.plist文件
NSAppTransportSecurity NSDictionary
NSAllowsArbitraryLoads BOOL YES
如有不明白的地方,网上有详细图文教程,在此不过多说明

下面来详细介绍网络请求方式:

同步GET

同步POST

异步GET

异步POST

Session请求

同步POST

//创建url对象
    NSURL *url  =[NSURL URLWithString:URL_PORT1];
    //创建请求对象
    NSMutableURLRequest *request =  [NSMutableURLRequest requestWithURL:url];
    
    //创建请求方式
    [request setHTTPMethod:@"post"];
    
    //设置请求参数
    NSData *tempData = [URL_PORT2 dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:tempData];
    
    //创建响应对象
    NSURLResponse *response = nil;
    
    //创建连接对象
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    
    if (data != nil) {
        //解析
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"%@",dic);
        
        for (NSDictionary *dict in dic[@"news"]) {
            News *news = [News new];
            [news setValuesForKeysWithDictionary:dict];
            [_dataArray addObject:news];
        }
        
        for (News *news in _dataArray) {
            NSLog(@"%@",news);
        }

        
    }

同步GET

//创建url对象
    NSURL  *url = [NSURL URLWithString:BASE_URL];
    
    //创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    //2.1创建请求方式(默认是get,这一步可以不写)
    [request setHTTPMethod:@"get"];
    
    //创建响应对象(有时会出错)
    NSURLResponse *response = nil;
    
    //创建连接对象
    NSError *error = nil;
     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    
    //解析
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    
    self.dataArray = [NSMutableArray arrayWithCapacity:5];
    
    
    for (NSDictionary *dict in dic[@"news"]) {
        News *news = [News new];
        [news setValuesForKeysWithDictionary:dict];
        [_dataArray addObject:news];
    }
    
//    for (News *news in _dataArray) {
//        NSLog(@"%@",news);
//    }

异步GET

//创建url对象
    NSURL *url = [NSURL URLWithString:BASE_URL];
    
    //创建请求对象
   NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
   
    //创建连接对象,实现代理
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    
    //开始执行
    [connection start];

异步POST

 NSURL *url = [NSURL URLWithString:URL_PORT1];
    
    //创建请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"post"];
    
    NSData *data = [URL_PORT2 dataUsingEncoding:NSUTF8StringEncoding];
    
    [request setHTTPBody:data];
    //连接
    NSURLConnection *connection  =[NSURLConnection connectionWithRequest:request delegate:self];
    
    [connection start];

一般的,当创建异步连接时, 很少用到第一种方式,经常使用的是代理方法。关于NSURLConnectionDataDelegate,我们经常使用的协议方法为一下几个:

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    
    NSLog(@"文件连接出现了error = %@",error);

    
}

//接收响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    
    self.tempData = [NSMutableData data];
}

//接收数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [_tempData appendData:data];
    
}

//加载完毕
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_tempData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
}

Session请求

NSURL *url = [NSURL URLWithString:BASE_URL];
    //创建session对象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //创建task(该方法内部做了处理,默认使用get)
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"%@",dic);
        
        NSLog(@"%d",[[NSThread mainThread]isMainThread]);
        
        
    }];
    
    //启动回话
    [task resume];

总结:

GET请求和POST请求的区别:

  1. GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过 ? 来间隔。POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器。

  2. GET请求参数会出现在接口中,不安全。而POST请求相对安全。

3.虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,POST多用于向后台提交数据。

同步和异步的区别:

同步链接:主线程去请求数据,当数据请求完毕之前,其他线程一律不响应,会造成程序就假死现象。

异步链接:会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅。

你可能感兴趣的:(iOS开发--网络请求)