【iOS】iOS中简单的网络请求

目录

前言

在完成暑假最后一个项目------仿写苹果原生APP天气预报时,需要进行网络请求,且网络请求在iOS开发中是比较重要的知识点,特学习并记录。

认识API和RUL

API

API,全称为应用程序编程接口(Application Programming Interface),是一套预先定义的函数、协议和工具,用于构建软件应用。API作为软件组件之间的桥梁,允许不同的程序或服务之间进行交互。

API的主要特点包括:

  1. 定义清晰的接口:API提供了一组清晰的规则和定义,说明如何使用这些接口。

  2. 封装:API隐藏了实现细节,只暴露了操作的接口,使得开发者可以不必了解底层实现就能使用这些功能。

  3. 模块化:API通常以模块化的方式提供,每个模块包含一组相关的功能。

  4. 可重用性:通过API,开发者可以重用现有的代码和功能,而不必从头开始编写。

  5. 跨语言:许多API支持多种编程语言,使得它们可以在不同的开发环境中使用。

  6. 网络API:在Web开发中,API经常用于客户端和服务器之间的数据交互,如RESTful API和SOAP API。

  7. 操作系统API:操作系统提供了API,允许应用程序访问系统资源,如文件、网络和硬件设备。

  8. 第三方API:许多服务和平台提供了API,允许开发者将它们的功能集成到自己的应用程序中。

  9. 版本控制:API可能会有多个版本,以适应不断变化的需求和技术进步。

  10. 文档:良好的API通常伴随着详细的文档,帮助开发者理解如何使用这些接口。

URL

URL(Uniform Resource Locator,统一资源定位符)是互联网上用来标识某一处资源的地址。它是一种特殊的URI(Uniform Resource Identifier,统一资源标识符),不仅提供了资源的定位信息,还定义了访问该资源的协议。

URL的基本结构通常如下所示:

复制代码
scheme://username:password@host:port/path?query_string#fragment

各部分的含义:

  • scheme :指定访问资源使用的协议,如httphttpsftp等。
  • usernamepassword:访问资源时的用户名和密码(现代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,指向你想要请求的网络资源。

objc 复制代码
NSString *urlString = @"https://devapi.qweather.com/v7/weather/now?location=101010100&key=467f2bf6c4234a32921e0f39da4d6b5c";
    
NSURL *url = [NSURL URLWithString:urlString];

2. 创建URLRequest对象

使用URL创建一个NSMutableURLRequest对象,并设置请求方法(如GET或POST)。

objc 复制代码
NSURLRequest *request = [NSURLRequest requestWithURL:url];
request.HTTPMethod = @"GET"; // 或者使用"POST"

3. 设置请求头(如果需要)

如果API需要特定的请求头,如认证令牌或内容类型,你需要设置它们。

objc 复制代码
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

4. 发送请求

使用URLSession发送请求。你可以选择同步或异步请求。

异步请求
objc 复制代码
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]; // 启动任务
同步请求
objc 复制代码
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.启动数据任务

objectivec 复制代码
[dataTask resume];

完整代码示例及运行结果:

objectivec 复制代码
- (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):

    objc 复制代码
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if (error) {
        NSLog(@"Error: %@", error.localizedDescription);
    } else {
        // 处理返回的数据
    }
  • 异步请求示例 (使用 NSURLSession):

    objc 复制代码
    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开发中的重要知识点,刚开始学习时还比较懵,需要多加理解,查阅资料,动手实践,在后面的学习和项目实践中应该会有更深层次的理解。

相关推荐
HarderCoder6 小时前
iOS 知识积累第一弹:从 struct 到 APP 生命周期的全景复盘
ios
goodSleep10 小时前
更新Mac OS Tahoe26用命令恢复 Mac 启动台时不小心禁用了聚焦搜索
macos
叽哥17 小时前
Flutter Riverpod上手指南
android·flutter·ios
用户092 天前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
YungFan2 天前
iOS26适配指南之UIColor
ios·swift
权咚2 天前
阿权的开发经验小集
git·ios·xcode
用户092 天前
TipKit与CloudKit同步完全指南
ios·swift
小溪彼岸2 天前
macOS自带截图命令ScreenCapture
macos
法的空间3 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
白帽黑客沐瑶3 天前
【网络安全就业】信息安全专业的就业前景(非常详细)零基础入门到精通,收藏这篇就够了
网络·安全·web安全·计算机·程序员·编程·网络安全就业