【iOS】iOS中简单的网络请求
目录
- 前言
- 认识API和RUL
- API
- URL
- 两者的联系
- 简单的网络请求
- 1. 创建URL对象
- 2. 创建URLRequest对象
- 3. 设置请求头(如果需要)
- 4. 发送请求
- 异步请求
- 同步请求
- 5. 处理请求结果
- 6.启动数据任务
- 完整代码示例及运行结果:
- 关于同步请求和异步请求
- 同步请求
- 异步请求
- 在iOS开发中的示例
- 总结
前言
在完成暑假最后一个项目——仿写苹果原生APP天气预报时,需要进行网络请求,且网络请求在iOS开发中是比较重要的知识点,特学习并记录。
认识API和RUL
API
API,全称为应用程序编程接口(Application Programming Interface),是一套预先定义的函数、协议和工具,用于构建软件应用。API作为软件组件之间的桥梁,允许不同的程序或服务之间进行交互。
API的主要特点包括:
-
定义清晰的接口:API提供了一组清晰的规则和定义,说明如何使用这些接口。
-
封装:API隐藏了实现细节,只暴露了操作的接口,使得开发者可以不必了解底层实现就能使用这些功能。
-
模块化:API通常以模块化的方式提供,每个模块包含一组相关的功能。
-
可重用性:通过API,开发者可以重用现有的代码和功能,而不必从头开始编写。
-
跨语言:许多API支持多种编程语言,使得它们可以在不同的开发环境中使用。
-
网络API:在Web开发中,API经常用于客户端和服务器之间的数据交互,如RESTful API和SOAP API。
-
操作系统API:操作系统提供了API,允许应用程序访问系统资源,如文件、网络和硬件设备。
-
第三方API:许多服务和平台提供了API,允许开发者将它们的功能集成到自己的应用程序中。
-
版本控制:API可能会有多个版本,以适应不断变化的需求和技术进步。
-
文档:良好的API通常伴随着详细的文档,帮助开发者理解如何使用这些接口。
URL
URL(Uniform Resource Locator,统一资源定位符)是互联网上用来标识某一处资源的地址。它是一种特殊的URI(Uniform Resource Identifier,统一资源标识符),不仅提供了资源的定位信息,还定义了访问该资源的协议。
URL的基本结构通常如下所示:
scheme://username:password@host:port/path?query_string#fragment
各部分的含义:
- scheme:指定访问资源使用的协议,如
http
、https
、ftp
等。 - username 和 password:访问资源时的用户名和密码(现代Web使用中较少,因为安全原因)。
- host:资源所在的服务器域名或IP地址。
- port:服务器监听的端口号(默认端口号通常与scheme对应,如HTTP默认为80,HTTPS默认为443)。
- path:服务器上资源的路径。
- query_string:查询字符串,用于提供附加信息或参数。
- fragment:片段标识符,用于指定资源内部的特定部分。
示例:
这里以一个常见的HTTP URL为例:
https://www.example.com/path/to/resource?search=keyword#section
https
:协议。www.example.com
:主机名。/path/to/resource
:资源路径。?search=keyword
:查询字符串,可能用于指定搜索参数。#section
:片段标识符,可能用于页面内锚点定位。
两者的联系
访问API:通常,API通过特定的URL来访问。这些URL指向API端点,允许执行特定的操作或请求数据。
资源标识:API的每个端点可以视为一种特殊类型的资源,URL用于标识这些资源。
HTTP请求:访问API时,通常使用HTTP请求(如GET、POST、PUT、DELETE等),这些请求通过URL发起。
数据传递:URL可以包含查询参数,这些参数经常用于API请求中传递额外的数据或配置信息。
网络通信:API和URL共同工作,实现客户端和服务器之间的网络通信。
RESTful架构:在RESTful架构风格中,API端点通常设计为使用URL来表示资源的状态转换。
简单的网络请求
在iOS开发中,进行简单的网络请求通常涉及使用URLSession
类,这是Foundation
框架中用于管理和配置网络连接的API。以下是使用URLSession
进行简单网络请求的基本步骤(这里以请求北京的实时天气为例):
1. 创建URL对象
首先,你需要有一个有效的URL,指向你想要请求的网络资源。
NSString *urlString = @"https://devapi.qweather.com/v7/weather/now?location=101010100&key=467f2bf6c4234a32921e0f39da4d6b5c";
NSURL *url = [NSURL URLWithString:urlString];
2. 创建URLRequest对象
使用URL创建一个NSMutableURLRequest
对象,并设置请求方法(如GET或POST)。
NSURLRequest *request = [NSURLRequest requestWithURL:url];
request.HTTPMethod = @"GET"; // 或者使用"POST"
3. 设置请求头(如果需要)
如果API需要特定的请求头,如认证令牌或内容类型,你需要设置它们。
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
4. 发送请求
使用URLSession
发送请求。你可以选择同步或异步请求。
异步请求
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"Error: %@", error.localizedDescription);
} else {
// 处理返回的数据
NSLog(@"Response data: %@", data);
}
}];
[dataTask resume]; // 启动任务
同步请求
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error) {
NSLog(@"Error: %@", error.localizedDescription);
} else {
// 处理返回的数据
NSLog(@"Response data: %@", data);
}
5. 处理请求结果
在异步请求的completion handler或同步请求后,检查响应状态,并解析返回的数据。如果响应是JSON格式,你可以使用NSJSONSerialization
来解析。
6.启动数据任务
[dataTask resume];
完整代码示例及运行结果:
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建API的URL
NSString *urlString = @"https://devapi.qweather.com/v7/weather/now?location=101010100&key=467f2bf6c4234a32921e0f39da4d6b5c";
//2.创建NSURL对象
NSURL *url = [NSURL URLWithString:urlString];
//3.创建NSURLRequest
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//4.创建NSURLSession
NSURLSession *session = [NSURLSession sharedSession];
//5.创建NSURLSessionDataTask
NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
//处理请求出错
NSLog(@"Error:%@", error.localizedDescription);
} else {
//6.处理请求结果(这里简单的将返回的数据转为字符串并输出)
NSString *responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Response:%@", responseData);
//如果需要解析JSON数据,可以使用类进行解析
// NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
}
}];
//7.启动数据任务
[dataTask resume];
// Do any additional setup after loading the view.
}
如果请求成功,运行结果如下:
关于同步请求和异步请求
同步请求(Synchronous Request)和异步请求(Asynchronous Request)是编程中用于描述任务执行方式的两个术语,尤其是在涉及网络通信或长时间运行任务时。它们的主要区别在于它们对调用者(如应用程序或其他执行环境)的影响。
同步请求
- 定义:同步请求是指调用方发出请求后,必须等待请求完成并收到响应才能继续执行其他任务。换句话说,同步请求会阻塞当前线程,直到操作完成。
- 特点:
- 调用者在请求发出后会等待结果。
- 请求处理期间,调用者不能执行其他操作。
- 通常用于简单的、快速的任务,或者在某些需要按顺序执行的任务中。
- 易于理解和实现,但可能影响性能和用户体验。
异步请求
- 定义:异步请求是指调用方发出请求后,不需要等待请求完成就可以继续执行其他任务。异步请求通常在后台线程中处理,完成后会通过回调函数、事件、promises或其他机制通知调用者。
- 特点:
- 调用者在请求发出后可以立即继续执行其他代码。
- 请求处理期间,调用者可以执行其他操作,如UI更新或数据处理。
- 适用于耗时的操作,如网络请求、文件读写等,可以提高应用程序的响应性和性能。
- 实现可能比同步请求复杂,需要管理回调和状态。
在iOS开发中的示例
-
同步请求示例(使用
NSURLConnection
):NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (error) { NSLog(@"Error: %@", error.localizedDescription); } else { // 处理返回的数据 }
-
异步请求示例(使用
NSURLSession
):NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"Error: %@", error.localizedDescription); } else { // 处理返回的数据 } }]; [dataTask resume]; // 启动任务
在iOS开发中,URLSession
通常用于执行网络请求。使用 sendSynchronousRequest:returningResponse:error:
方法会执行同步请求,而使用 dataTaskWithRequest:completionHandler:
方法会创建一个异步请求。异步请求不会阻塞主线程,因此是执行网络请求的首选方式,特别是在用户界面上。同步请求由于会阻塞主线程,可能会导致用户界面卡顿或无响应,因此在实际开发中应谨慎使用。
总结
网络请求是iOS开发中的重要知识点,刚开始学习时还比较懵,需要多加理解,查阅资料,动手实践,在后面的学习和项目实践中应该会有更深层次的理解。