ios网络请求
2021-09-18 本文已影响0人
一个好笑的人
写在前面
Web Service (SOAP)和HTTP接口的区别
-
SOAP是一个基于XML的协议交换消息,可以使用HTTP来传输这些信息。事实上HTTP是SOAP消息的最常见的传输工具;
-
SOAP将信息进行XML的序列化后,再用HTTP协议的方式再打包进行传送。
目录
1.Web Service
每个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结合使用;