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

相关推荐
bingo69112 分钟前
Qt-常用控件(3)-多元素控件、容器类控件和布局管理器
开发语言·qt
蒙娜丽宁13 分钟前
深入探讨Go语言中的切片与数组操作
开发语言·后端·golang·go
AI信息风向14 分钟前
iOS 15推出后利用邮件打开率的7种方法
ios
GISer小浪花努力上岸1 小时前
Java实现简易计算器功能(idea)
java·开发语言·intellij-idea
2401_858120531 小时前
深入理解 Swift 中的隐式解包可选类型(Implicitly Unwrapped Optionals)
开发语言·ios·swift
quaer1 小时前
QT chart案例
开发语言·qt·swift
海海向前冲2 小时前
设计模式 -- 单例设计模式
java·开发语言·设计模式
TT-Kun2 小时前
C++ | vector 详解
开发语言·c++
alsknv2 小时前
IP地址是怎么实现HTTPS访问的?
网络·网络协议·tcp/ip·安全·web安全·http·https
陈大爷(有低保)2 小时前
JS基础语法
开发语言·javascript·ecmascript