美文网首页
ios网络请求

ios网络请求

作者: 一个好笑的人 | 来源:发表于2021-09-18 01:10 被阅读0次

    写在前面

    Web Service (SOAP)和HTTP接口的区别

    • SOAP是一个基于XML的协议交换消息,可以使用HTTP来传输这些信息。事实上HTTP是SOAP消息的最常见的传输工具;

    • SOAP将信息进行XML的序列化后,再用HTTP协议的方式再打包进行传送。

    目录

    1.Web Service

    20多个常用的免费WebService接口

    每个WebService会有调用参数文档,有demo

    2.NSURLSession API

    2.1 Overview

    2.1.1 主要类有:

    • NSURLSession 会话

    • NSURLSessionConfiguration 会话配置

    • NSURLSessionTask 会话任务 ( 新创建的task默认是暂停的,需要显示让其执行 [ _task resume ] )

    2.1.2 主要协议有:

    • NSURLSessionDelegate

    • NSURLSessionTaskDelegate

    • NSURLSessionDataDelegate

    • NSURLSessionDownloadDelegate

    2.1.3 会话形式:

    • 简单会话 不可配置会话,只能执行基本的网络情况;通过NSURLSession的静态方法 +sharedSession获得对象;见下面2.2 。

    • 默认会话 default session; 与简单会话类似,但是可以配置会话(比如指定使用POST方法),创建方法见下面2.3 。

    • 短暂会话 详情见ios开发指南p392

    • 后台会话 详情见ios开发指南p392

    2.2 简单会话实现GET请求

    • Web Service请求到的数据是json或者xml格式的,可以用下面这句查看请求到的data,看看是什么格式:
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",str);
    
    • 默认情况下简单对话是在非主队列中执行的,所以刷新UI需要切换回主队列执行
    /*这个Webservice是Json格式的*/
    NSString *appkey = @"bf1d95bd730f031fb019ba80ffabb89d";
    NSString *baseURL = @"http://op.juhe.cn/onebox/weather/query";
    NSString *url = [baseURL stringByAppendingString:[NSString stringWithFormat:@"?cityname=%@&dtype=&key=%@", @"上海", appkey]];
    NSString *urlStr = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];//把中文部分转码和谐掉
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]];//建立请求对象 
    NSURLSession *session = [NSURLSession sharedSession];//创建一个简单会话对象(简单对话默认在非主队列执行,如何创建在主队列执行的默认对话请看下面post请求)
    ///创建任务对象task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:
            ^(NSData *data, NSURLResponse *response, NSError *error) {
            NSLog(@"请求完成...");
            if (!error) {
                NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];          
                dispatch_async(dispatch_get_main_queue(), ^{//由于默认情况下简单对话是在非主队列中执行的,所以这里刷新UI需要切换回主队列(主线程?)执行
                    [self reloadView:resDict];
               });
            } else {
                NSLog(@"error : %@", error.localizedDescription);
            }
        }];
    [task resume];//新创建的task默认是暂停的,需要显示让其执行
    
    
    /*这个Webservice是Xml格式的*/
    NSString *baseURL = @"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName";
    NSString *url = [baseURL stringByAppendingString:[NSString stringWithFormat:@"?theCityName=%@", @"上海"]];//GET方法的参数直接跟在URL后面,是明文;参数如何设置是在对应的Webservice网站上查的
    NSString *urlStr = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];//把中文部分转码和谐掉
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]];//建立请求对象 
    NSURLSession *session = [NSURLSession sharedSession];//创建一个会话对象
    ///创建任务对象task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:
            ^(NSData *data, NSURLResponse *response, NSError *error) {
            NSLog(@"请求完成...");
            if (!error) {
               NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
               NSLog(@"%@",str);
            } else {
                NSLog(@"error : %@", error.localizedDescription);
            }
        }];
    [task resume];//新创建的task默认是暂停的,需要显示让其执行
    
    

    2.3 实现Post请求 (请求天气预报web service,xml格式)

    • 使用POST关键是用NSMutableURLRequest类代替NSURLRequest类,因为要手动设定request对象使用POST。
        NSString *baseURL = @"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName";
        NSString *post = [NSString stringWithFormat:@"theCityName=%@", @"上海"];//POST的请求参数
        NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];//将POST的请求参数封装成NSData类
    
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:baseURL]];//创建request对象
        [request setHTTPMethod:@"POST"];//显示设定request使用POST方法
        [request setHTTPBody:postData];//把POST的请求参数放到请求体里面
    
        NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];//(使用默认会话,这样会task就会在主队列执行)
        NSURLSession *session = [NSURLSession sessionWithConfiguration: defaultConfig delegate: nil delegateQueue: [NSOperationQueue mainQueue]];//(使用默认会话,这样task就会在主队列执行)
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:
            ^(NSData *data, NSURLResponse *response, NSError *error) {
            NSLog(@"请求完成...");
            if (!error) {
                NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];//查看请求到的数据
                NSLog(@"%@",str);           
            } else {
                NSString *str =@"错误";
                NSLog(@"%@",str);
            }
        }];
    
        [task resume];
    
    
    • 以下为上面代码执行后的NSLog的输出:
    <?xml version="1.0" encoding="utf-8"?>
    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
      <string>直辖市</string>
      <string>上海</string>
      <string>58367</string>
      <string>58367.jpg</string>
      <string>2021/7/28 20:25:41</string>
      <string>27℃/31℃</string>
      <string>7月28日 小雨转阴</string>
      <string>东南风3-4级</string>
      <string>7.gif</string>
      <string>2.gif</string>
      <string>今日天气实况:气温:28℃;风向/风力:北风 1级;湿度:90%;紫外线强度:最弱。</string>
      <string>中国人民保险感冒指数:少发,感冒机率较低,避免长期处于空调屋中。
    健臻·血糖指数:易波动,气温多变,血糖易波动,请注意监测。
    穿衣指数:热,适合穿T恤、短薄外套等夏季服装。
    洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。
    紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。
    </string>
      <string>26℃/31℃</string>
      <string>7月29日 阴转小雨</string>
      <string>南风3-4级</string>
      <string>2.gif</string>
      <string>7.gif</string>
      <string>26℃/32℃</string>
      <string>7月30日 阴转晴</string>
      <string>西风3-4级转西南风小于3级</string>
      <string>2.gif</string>
      <string>0.gif</string>
      <string>上海简称:沪,位置:上海地处长江三角洲前缘,东濒东海,南临杭州湾,西接江苏,浙江两省,北界长江入海,正当我国南北岸线的中部,北纬31°14′,东经121°29′。面积:总面积7823.5平方公里。人口:人口1000多万。上海丰富的人文资源、迷人的城市风貌、繁华的商业街市和欢乐的节庆活动形成了独特的都市景观。游览上海,不仅能体验到大都市中西合壁、商儒交融、八方来风的氛围,而且能感受到这个城市人流熙攘、车水马龙、灯火璀璨的活力。上海在中国现代史上占有着十分重要的地位,她是中国共产党的诞生地。许多震动中外的历史事件在这里发生,留下了众多的革命遗迹,处处为您讲述着一个个使人永不忘怀的可歌可泣的故事,成为包含民俗的人文景观和纪念地。在上海,每到秋祭,纷至沓来的人们在这里祭祀先烈、缅怀革命历史,已成为了一种风俗。大上海在中国近代历史中,曾是风起云涌可歌可泣的地方。在这里荟萃多少风云人物,散落在上海各处的不同住宅建筑,由于其主人的非同寻常,蕴含了耐人寻味的历史意义。这里曾留下许多革命先烈的足迹。瞻仰孙中山、宋庆龄、鲁迅等故居,会使您产生抚今追昔的深沉遐思,这里还有无数个达官贵人的住宅,探访一下李鸿章、蒋介石等人的公馆,可以联想起主人那段显赫的发迹史。</string>
    </ArrayOfString>
    
    

    2.4 下载数据

    • 使用NSURLSessionDownloadTask实现;

    • 如果想知道下载进度或者支持断点续传,需要实现NSURLSessionDownloadDelegate委托协议来接受服务器回调事件

    • 例子见Demo 16.2.5

    2.5 GET和POST

    • 通过上面的实践可以发现,get方法直接把请求参数放在了URL里面明文裸奔,而post方法把请求参数单独拿出来放在httpbody里面封装传输。

    3. AFNetworking (底层采用NSURLSession)

    3.1 why to choose it?

    • 这个项目有基金会支持,因此有稳定的技术支持;

    • 底层采用NSURLSession,能发挥NSURLSession的优势,弥补NSURLSession的不足,可以和NSURLSession结合使用;

    3.2 How to config it ?

    3.3 How to use it ?

    相关文章

      网友评论

          本文标题:ios网络请求

          本文链接:https://www.haomeiwen.com/subject/nivmwltx.html