当前位置: 首页 > article >正文

【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的主要特点包括:

  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,指向你想要请求的网络资源。

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


http://www.kler.cn/a/283747.html

相关文章:

  • Linux网络——网络初识
  • Spring-Webflux + Reactor + Netty 初体验
  • c++写一个死锁并且自己解锁
  • Vector 深度复制记录
  • AI大模型开发架构设计(18)——基于大模型构建企业知识库案例实战
  • jmeter介绍、使用方法、性能测试、现参数化和数据驱动、分布式测试、压力测试、接口测试
  • Openai api via azure error: NotFoundError: 404 Resource not found
  • 优化系统性能:深入探讨Web层缓存与Redis应用的挑战与对策
  • 虹科技术|全新Linux环境PCAN驱动程序发布!CAN/CAN FD通信体验全面升级!
  • C# 什么是属性
  • Linux操作系统在虚拟机VM上的安装【CentOS版本】
  • 深入解析 Maven 子父模块的依赖管理
  • Java 面试题:HTTP版本演变--xunznux
  • Web-gpt
  • UR5e Gazebo仿真
  • Go 服务调试精解
  • 备战秋招60天算法挑战,Day28
  • 个人旅游网(1)——数据库表详解
  • 爬虫入门学习
  • Java Web —— 第十天(AOP切面编程)
  • Dxf文件中多段线弧线的计算
  • 三星与海力士发力决战HBM4
  • 【知识】缓存类型和策略
  • 数据合规性分析:守护信息安全的关键防线
  • 原生开发柱状图
  • 钉钉好用吗?类似钉钉的内部知识库有哪些?