「OC」简单网络请求的实现
文章目录
- 「OC」简单网络请求的实现
- 写在前面
- URL和API
- 网络请求的流程
- 网络申请数据解析
- 参考文章
写在前面
在暑假最后一个项目天气预报之中,使用了网络请求,虽然说还是不太理解网络请求之中的相关内容,以及在写天气预报的过程之中因为网络请求遭遇了许多的问题,一度时间改的很崩溃,好在因为这个项目本身没有特别多的控件和难度,最后还是将天气预报给写了出来。
URL和API
在实现网络请求之前,我们需要了解一下什么是URL和API
URL (Uniform Resource Locator):
- URL 是统一资源定位符的缩写,用于指定互联网上资源的位置。它是 Web 地址的标准格式,可用来定位网页、图像、视频、文件等网络资源。
- 一个标准的 URL 包含协议部分(如 HTTP、HTTPS)、服务器地址或域名、资源路径和可能的查询参数,例如:
https://www.example.com/page?param=value
- URL 不仅用于定位网页,在计算机系统中还用于指向文件、目录等各种资源。
API (Application Programming Interface):
- API 是应用程序编程接口的缩写,是一组定义软件组件如何相互交互的规范。
- 在软件开发中,API 可以用来描述不同软件组件之间的通信方式、数据格式、函数或方法的调用规则等,帮助不同的软件模块进行交互。
- Web API 是一种特定形式的 API,用于通过网络进行数据交换,通常以某种标准格式(如 JSON 或 XML)提供数据。Web API 可以用于实现不同系统之间的通信和数据交换。
网络请求的流程
- 用
NSString
创建URL, - 创建NSURL对象:用 URLSession 对象来进行网络请求。
- 创建
URLRequest
对其进行相关请求,分为GET和POST方法 - 根据会话创建任务
- 启动任务
天气预报代码示例:
// 用 NSString 创建 URL
NSString *urlString = @"https://devapi.qweather.com/v7/weather/now?location=101110101&key=487fcdf6fdc9401da0ac4c4df535f43d";
NSURL *url = [NSURL URLWithString:urlString];
// 创建 URLSession 对象
NSURLSession *session = [NSURLSession sharedSession];
// 创建 URLRequest 对其进行相关请求,这里使用 GET 方法
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 根据会话创建任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//用block实现回调,处理接受的参数
if (error) {
NSLog(@"错误: %@", error);
return;
}
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
NSError *jsonError;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError) {
NSLog(@"解析失败: %@", jsonError);
} else {
NSLog(@"数据如下: %@", json);
// 在这里处理返回的数据
}
} else {
NSLog(@"非法响应: %ld", (long)httpResponse.statusCode);
}
}];
// 启动任务
[task resume];
NSURL
:保存 Web 应用的位置信息,通常包括基地址、应用名和参数。NSURLRequest
:保存要发送给服务器的数据,包括NSURL
对象,请求方法(GET、POST)、缓存策略、超时时间和额外的 HTTP 信息。NSMutableURLRequest
是其可变子类。NSURLSessionTask
:表示NSURLRequest
的生命周期,追踪请求状态,并允许执行取消、暂停和继续操作。有多个子类如:NSURLSessionDataTask
用于处理普通的 HTTP 请求和响应数据,NSURLSessionUploadTask
用于上传数据,NSURLSessionDownloadTask
用于下载数据。NSURLSession
:作为NSURLSessionTask
对象的工厂,用于设置任务的通用属性,如请求头、蜂窝网络下的请求权限。其委托功能强大,可追踪任务状态和处理服务器认证。
注意我们这里只是使用默认的GET方法进行最简单的网络申请,以上内容也是我在网络检索得到,对相关概念其实还是缺乏深入了解,目前也只是仅仅知道正确的网络申请流程,但不了解其原因。
网络申请数据解析
如果我们使用刚刚上面给出的链接在浏览器之中进行打开之后就可以看到以下信息了。
{
"code": "200",
"updateTime": "2024-08-03T15:02+08:00",
"fxLink": "https://www.qweather.com/weather/shantou-101280501.html",
"now": {
"obsTime": "2024-08-03T14:56+08:00",
"temp": "35",
"feelsLike": "37",
"icon": "100",
"text": "晴",
"wind360": "315",
"windDir": "西北风",
"windScale": "3",
"windSpeed": "12",
"humidity": "52",
"precip": "0.0",
"pressure": "1007",
"vis": "30",
"cloud": "10",
"dew": "25"
},
"refer": {
"sources": [
"QWeather"
],
"license": [
"CC BY-SA 4.0"
]
}
}
在天气预报之中我们获取天气等相关数据,获得的数据格式大多是为JSON格式,我们请求网络数据再使用相关数据进行美化之后我们就可以更加简单的对申请到的JSON进行解析。
JSON数据和OC之中的关系如下表
JSON | OC |
---|---|
大括号—— {} | NSDictionary |
中括号—— [] | NSArray |
双引号—— “” | NSString |
数字 | NSNumber |
对JSON数据的解析就放在刚刚blcok的回调之中,根据JSON数据和OC之中的关系,我们可以对JSON数据进行OC的转化
那我们拿模糊搜索来举一个例子
- (void)fetchCityData {
NSString *urlString = [NSString stringWithFormat:@"https://geoapi.qweather.com/v2/city/lookup?location=%@&key=487fcdf6fdc9401da0ac4c4df535f43d", self.searchBar.text];
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *nowDataTask = [session dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData *nowData, NSURLResponse *response, NSError *nowError) {
if (nowError) {
NSLog(@"当前天气请求失败: %@", nowError.localizedDescription);
return;
}
NSDictionary *nowWeatherData = [NSJSONSerialization JSONObjectWithData:nowData options:0 error:nil];
NSArray *locationArray = nowWeatherData[@"location"];
[self.cityArray removeAllObjects];
for (NSDictionary *locationInfo in locationArray) {
NSString *cityName = [NSString stringWithFormat:@"%@ - %@", locationInfo[@"name"], locationInfo[@"country"]];
[self.cityArray addObject:@{@"name": cityName, @"id": locationInfo[@"id"]}];
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView1 reloadData];
});
}];
[nowDataTask resume];
}
- 构建请求的 URL 字符串:首先,根据用户在搜索栏中输入的内容,格式化了一个包含 API 端点的 URL 字符串,包括用户输入的位置信息和 API 密钥。
- 对 URL 字符串进行编码:使用
stringByAddingPercentEncodingWithAllowedCharacters
方法对 URL 字符串进行编码,确保其中的特殊字符符合 URL 编码规范。 - 创建共享的
NSURLSession
对象:实例化了一个NSURLSession
对象,用于执行网络请求。 - 创建数据任务:使用
dataTaskWithURL:completionHandler:
方法创建了一个数据任务nowDataTask
,该任务会根据提供的 URL 发起网络请求,并在请求完成后执行相应的回调处理。 - 启动数据任务:最后,通过调用
resume
方法启动了数据任务nowDataTask
,使其开始执行网络请求。 - 处理网络请求的响应数据:在任务的完成处理程序中,首先检查了是否有请求错误,如果有错误则在控制台打印错误信息;若请求成功,将返回的数据解析成 JSON 格式,并提取出其中的
location
数组。 - 处理返回的数据:清空了
self.cityArray
数组,然后遍历locationArray
数组中的每个元素,提取城市名称和国家信息,将其格式化为特定的字符串,并将城市名称和对应的 ID 添加到self.cityArray
数组中。 - 在主线程更新 UI:使用
dispatch_async(dispatch_get_main_queue(), ^{}
将 UI 操作放入主线程队列,调用reloadData
方法刷新tableView1
中显示的数据。
可以看到我们在回调函数之中,我们将JSON数据转化为了字典nowWeatherData
,然后将模糊搜索获得的城市名称以及其所属省份的相关数据取出,放入相关的数组之中,、并且更新我们的TableView,使得我们可以实现模糊搜索的功能。
参考文章
NSURL、NSURLRequest、NSURLSession和NSURLSessionTask