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

news2024/11/15 19:59:27

目录

  • 前言
  • 认识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.coloradmin.cn/o/2076627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 cascader省市区三级联动如何指定字段,如何根据id查到对应的名字

如果我们接口数据字段名不是value和code。要加个props :props"{ value:code,label:regionName}"根据id查name需要一个ref和一个change事件<el-cascader :options"areaData" ref"addressCodeRef" change"handleChange" :props"…

MySQL(五)——表设计(约束、范式、表关系)

文章目录 表设计约束非空约束&#xff08;NOT NULL&#xff09;唯一约束&#xff08;UNIQUE&#xff09;主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;默认值约束&#xff08;DEFAULT&#xff09;检查约束&#xff08;CHECK&#x…

考研数学最迟什么时候要结束强化?10月才做真题是不是晚了?

已经快9月了&#xff0c;很多同学的考研数学的强化也接近尾声&#xff0c;这个时候要注意两个事情&#xff1a; 1、如果你还有很多没学完&#xff0c;不要强行收尾&#xff0c;稳扎稳打的把强化给结束了。 2、强化结束之前&#xff0c;要清理完所有在强化阶段产生的错题&…

Kafka日志及常见问题

目录 1.Topic下的消息是如何存储的 1.1log文件追加记录所有消息 1.2index和timeindex加速读取日志信息 2.文件清理机制 2.1如何判断哪些日志文件过期了 2.2日志清理策略 3.Kafka的文件高效读写机制 3.1Kafka的文件结构 3.2顺序写磁盘 3.3零拷贝 3.3.1传统IO 3.3.2m…

应用层与传输层

1.应用层 很多时候这一层的协议是程序员自定义的应用层协议&#xff08;相当于一种约定&#xff0c;约定数据如何进行传输&#xff09;。 eg&#xff1a; 实现登录的场景&#xff1a; 此时前端就需要与后端约定请求&#xff08;假设约定使用ajax请求&#xff09;中的一些参…

接口自动化测试面试题目详解

1、get和post区别是什么&#xff1f; 答&#xff1a;POST和GET都是向服务器提交数据&#xff0c;并且都会从服务器获取数据。 区别&#xff1a; &#xff08;1&#xff09;传送方式&#xff1a;get通过地址栏传输&#xff0c;post通过报文传输 &#xff08;2&#xff09;传…

c语言 自定义类型--枚举 、联合 #枚举类型的定义 #枚举的优点 #枚举的使用 #联合类型的定义 #联合的特点 #联合大小的计算

文章目录 前言 一、枚举 (一)、枚举类型的定义 (二)、枚举的优点 (三)、枚举的使用 二、联合 (一)、联合类型的定义 (二)、联合的特点 (三)、联合大小的计算 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 枚举、联合跟结构体很像&#xff0c;想要细致地了…

基于SpringBoot+Vue+uniapp的“村游网”系统的微信小程序开发的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取源码获取 前言 &#x1f31e;博主介绍 &#xff1a;✌全网粉丝15W,CSDN特邀作者、21…

基于状态机实现WIFI模组物联网

1.0 状态机框架原理 如果成功的话就连接热点&#xff0c;如果失败就返回AT通信检查&#xff0c;如果AT通信检查还是失败就放回硬件复位这个状态&#xff0c;如果热点链接成功&#xff0c;就连接MQTT指令&#xff0c;如果失败就返回AT通信检查&#xff0c;如果成功就连接云平台通…

跟着B站前端面试总结回顾前端基础知识(一)

组件划分标准 组件划分_哔哩哔哩_bilibili 在前端Vue开发中&#xff0c;组件的划分是构建高效、可维护应用的关键步骤。Vue组件的划分标准通常基于多个方面的考虑&#xff0c;包括但不限于功能独立性、复用性、可维护性和可扩展性。以下是一些Vue组件划分的标准&#xff1a; …

破解历史合同“旧题” 答好集体经济“新篇”

——汕头市龙湖区&#xff1a;全面推进乡村振兴战略 实现农村集体经济新飞跃 农村集体资产资源是乡村赖以生存的家底&#xff0c;也是村集体经济发展壮大、更好推动乡村振兴战略加力提速的承载。自2023年10月开始&#xff0c;在汕头市龙湖区的广袤乡村上&#xff0c;一场关于村…

图解搜索算法(BFS、DFS、Dijstra算法、KSP算法、A*算法)

文章目录 深度优先搜索算法广度优先搜索算法Dijkstra算法KSP算法A*算法 由于在工作中用到了BFS算法、DFS算法、Dijkstra算法、KSP算法&#xff0c;因此将上述算法的工作原理记录一下&#xff0c;同时用图解的方式解释相应的算法。A*算法由于本文在工作中&#xff0c;还没用过&a…

深度学习语义分割篇——LR-ASPP原理详解+源码实战

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

简单使用富有创造力的DALL·E 3 图像生成器——OpenAI Images Generations API

OpenAI Images Generations API 申请及使用 DALL-E 3 是 OpenAI 开发的两个版本的图像生成模型&#xff0c;它们能够根据文本描述生成高质量的图像。 本文档主要介绍 OpenAI Images Generations API 操作的使用流程&#xff0c;利用它我们可以轻松使用官方 OpenAI DALL-E 的图…

类和构造函数之间的继承

类之间构造函数的继承是面向对象编程中的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过这种方式&#xff0c;子类可以复用父类的代码&#xff0c;从而避免重复&#xff0c;提高代码的可维护性…

Swagger的增强knife4j

效果图 导入依赖 <!--不是导入swagger原因就是&#xff1a;knife4j对swagger增强--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version><…

考研数学| 张宇线代9讲换李永乐线代讲义,强化来得及吗?

张宇线代9讲&#xff1a; 张宇老师的线代九讲和张宇老师的线代课程搭配使用&#xff0c;相对于更适合线代底子足够强的同学。整体书的题目难度较大&#xff0c;所以开始刷了之后发现不适合自己可以选择换一本习题册&#xff0c;当然如果担心时间不够还是想尽力刷下去的话可以去…

8款每天都能用到的网站和APP,值得收藏

5个网站3个APP&#xff0c;都是自己每天常用的一些工具&#xff0c;强大实用&#xff0c;能给自己省不少事&#xff0c;分享给大家~ 1、奶牛快传 https://cowtransfer.com/ 一个让你轻松上传和分享大文件的网站。跟那些需要下载app、操作复杂的服务不同&#xff0c;奶牛快传…

随机森林与线性回归

集成学习方法之随机森林 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个分类器来提高预测性能的方法。主要分为三种类型:Bagging、Boosting和Stacking。以下是集成学习的基本步骤和概念&#xff1a; 1数据采样&#xff1a;从训练集中有放回地随机抽取…

前端手写源码系列(一)—— 手写防抖和节流

目录 1.实现防抖函数&#xff08;debounce&#xff09;2.实现节流函数&#xff08;throttle&#xff09;时间戳的方式&#xff1a;定时器方式&#xff1a; 3.总结 1.实现防抖函数&#xff08;debounce&#xff09; 防抖函数原理&#xff1a;把触发非常频繁的事件合并成一次去执…