网络请求,get和post

本文详细介绍了iOS开发中使用NSURLSession进行GET和POST请求的方法,包括请求的构造、执行及响应处理等关键步骤,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 网址的三种方式 1. Http:// 域名  2.Http:// losthost:8080   3.http:// 127.0.0.1  现在的网址将http -->https(安全证书  用钱)

在data source粘代码,不粘代码用不了!!!!!!!!

 /* 

    <key>NSAppTransportSecurity</key>

    <dict>

    <key>NSAllowsArbitraryLoads</key>

    <true/>

    </dict>

     */


GET block 

1.获取网址url      2.创建一个请求      3.创建一个session对象 [NSURLSession sharedSession]   4.根据session创建一个任务对象task[session  dataTaskWithRequest]      5.任务手动执行[task resume]

<span style="color:#ff0000;">   </span> NSString *strURL = @"http://project.lanou3g.com/teacher/yihuiyun/lanouproject/movielist.php";
    NSURL *url = [NSURL URLWithString:strURL];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 创建一个session对象
    NSURLSession *session = [NSURLSession sharedSession];
    // 根据session对象,创建一个任务task
    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@", response);
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@", dic);
    }];
    // 任务必须手动执行!!!!!!!!!!!!!!!!!!!!!!!!!!!
    [task resume];<span style="color:#ff0000;">
</span>
数据在子线程里请求,但是还是需要在主线程里显示,所以需要把请求的数据当到主线程里显示

<span style="color:#cc33cc;"> </span>dispatch_queue_t mainQueue = dispatch_get_main_queue();
        dispatch_async(mainQueue, ^{
            // 在这里面写数据的处理
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            self.arr = [NSMutableArray array];
            for (NSDictionary *temp in dic[@"result"]) {
                Movie *movie = [[Movie alloc] init];
                [movie setValuesForKeysWithDictionary:temp];
                [self.arr addObject:movie];
            }
            // 刷新!!!!!!
            [self.tableView reloadData];
        });
    }];<span style="color:#cc33cc;">
</span>

POST block 

设置和GET一样,只是多了四句代码  1.改变网络请求    2.将bodyStr转换成bodyData   4.将bodyData加入到请求中

 NSString *strURl = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=15&udid=1234567890&terminalType=Iphone&cid=213";
    NSURL *url = [NSURL URLWithString:strURl];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    [request setHTTPMethod:@"POST"];
    NSString *bodyStr = @"username=daka&pwd=123";
    NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:bodyData];
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@", dic);
    }];
    [task resume];

GET的协议方法

NSURLSessionDelegate是session的代理方法 , NSURLSession的使用和NSURLConnection的使用基本相似,他在7.0以后出现,他的出现主要是为了提高connection的性能 , 提供下载等功能

session可以通过协议和block两种方式进行使用

 1.网址 , 网址是由字母,数字和特殊符号比如/,&,?,=,$组成,所以一般的url里没有汉字,如果有汉字的话需要给他进行转码 ; 在ios9.0以后,转码的方法也发生了变化,采用字符集合的方式对网址进行转码操作

[urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:urlStr]];

2.创建一个请求对象   3.创建一个session对象   4.创建一个session的task任务对象 5.任务执行,如果不写,整个请求都不自动执行


  // 1.网址
    NSString *urlStr= @"http://api.map.baidu.com/place/v2/search?query=银行&region=大连&output=json&ak=6E823f587c95f0148c19993539b99295";
    // url由字母,数字和特殊的符号比如/,&,?,=,$组成,所以一般的url里没有汉字的,所有的汉字在请求的时候需要给他进行转码
    // ios9.0以后,转码的方法也发生了变化,采用字符集合的方式对网址进行转码操作
    // 带中文的网址需要转码!!!!!!!!!!!!!
    // 2.有中文转码
    urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:urlStr]];
//    NSLog(@"%@", urlStr);
    // NSString --> NSURL
    NSURL *url = [NSURL URLWithString:urlStr];
    // 3.创建一个请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 创建NSURLSession对象
    // 4.创建session对象
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    // 5.创建一个session的tast任务对象
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
    // 6.任务执行, 如果不写这句话,整个请求都不自动去执行
    [task resume];

要完成网络请求,一般使用三个协议

1.didReceive ---> 694行  这个方法会把请求的服务器响应信息返回,就是response,这里面能查看响应码status code,200就是请求成功,404就是没有找到对应页,response可以查看这个网址是否正确的信息

2.服务器响应之后,需要允许服务器响应,才可以继续接收从服务器返回的数据,方法里第四个参数block就是左这个功能

3.当手机与服务器都允许后,self.data用来接收数据

<span style="font-size:18px;">- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
    //方法会把请求的服务器响应信息返回,就是response,这里面能查看响应码status code,200就是请求成功,404是没有找到对应的页面,response可以查看这个网址是否正确的信息
    NSLog(@"%@",response);
    // 服务器响应之后,需要允许服务器响应,才可以继续接收从服务器返回的数据,方法里第四个参数block就是做这个功能
    completionHandler(NSURLSessionResponseAllow);
    // 当手机与服务器都允许之后,初始化self.data用来接收数据
    self.data = [NSMutableData data];
}</span>

2.用来接收数据的协议方法,在接收数据的过程中,这个方法会被调用多次,直到数据全部接收完成 728行

只要执行这个方法,会把数据data返回,我们在这个方法里需要做的,就是把方法data全部进行累加,等到最后一个数据请求下来之后,所有数据累加到一起,完成请求的过程

<span style="font-size:18px;">- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)data{
    // 只要执行这个方法,会把数据data返回,我们在这个方法里需要做的,就是把方法data全部进行累加,等到最后一个数据请求下来之后,所有数据累加到一起,完成请求的过程
    [self.data appendData:data];
}</span>

3.这个协议方法一般会在完成请求或者请求失败时触发,区分的话就是error,如果请求成功,error没有值  675行

<span style="font-size:18px;">- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error{
    NSLog(@"%@", error);
       // 判断,防止崩溃
    if (error == nil) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.data options:0 error:nil];
        NSLog(@"%@", dic);
    } else {
        NSLog(@"请求失败");
    }
}</span><span style="color:#ff0000;">
</span>

post的协议方法 

前三部和GET一样 4.设置当前请求的方式setHttpMethod   5.第二部分字符串,将字符串转换成data(通过UTF8编码)  6.加到请求成setHttpBody 协议方法和GET一样

<span style="color:#cc0000;"> </span><span style="font-size:18px;">NSString *strURL = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=15&udid=1234567890&terminalType=Iphone&cid=213";
    NSURL *url = [NSURL URLWithString:strURL];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 第一部分:设置当前的请求方式
    // 请求方式默认是GET
    // 请求方式还有PUT, DELETE
    [request setHTTPMethod:@"POST"];
    // 第二部分
    NSString *bodyStr = @"username=daka&pwd=123";
    // 将字符串转换成data                           UTF8编码
    NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
    // 加到请求中
    [request setHTTPBody:bodyData];
    // 剩下的GET一样</span><span style="color:#cc0000;">
</span>

同步:同步请求时,其他功能用不了,没有网络,请求的数据是空;对json解析的话,代码会崩溃(不用)

 <span style="font-size:18px;">NSString *urlStr = @"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg";
    NSURL *url = [NSURL URLWithString:urlStr];
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSLog(@"%@", data);
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@", dic);</span>
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值