「OC」简单网络请求的实现

news2024/9/22 4:10:10

「OC」简单网络请求的实现

文章目录

  • 「OC」简单网络请求的实现
    • 写在前面
    • URL和API
    • 网络请求的流程
    • 网络申请数据解析
    • 参考文章

写在前面

在暑假最后一个项目天气预报之中,使用了网络请求,虽然说还是不太理解网络请求之中的相关内容,以及在写天气预报的过程之中因为网络请求遭遇了许多的问题,一度时间改的很崩溃,好在因为这个项目本身没有特别多的控件和难度,最后还是将天气预报给写了出来。

URL和API

在实现网络请求之前,我们需要了解一下什么是URL和API

URL (Uniform Resource Locator):

  • URL 是统一资源定位符的缩写,用于指定互联网上资源的位置。它是 Web 地址的标准格式,可用来定位网页、图像、视频、文件等网络资源。
  • 一个标准的 URL 包含协议部分(如 HTTP、HTTPS)、服务器地址或域名、资源路径和可能的查询参数,例如:https://www.example.com/page?param=value
  • URL 不仅用于定位网页,在计算机系统中还用于指向文件、目录等各种资源。

API (Application Programming Interface):

  • API 是应用程序编程接口的缩写,是一组定义软件组件如何相互交互的规范。
  • 在软件开发中,API 可以用来描述不同软件组件之间的通信方式、数据格式、函数或方法的调用规则等,帮助不同的软件模块进行交互。
  • Web API 是一种特定形式的 API,用于通过网络进行数据交换,通常以某种标准格式(如 JSON 或 XML)提供数据。Web API 可以用于实现不同系统之间的通信和数据交换。

网络请求的流程

  1. NSString创建URL,
  2. 创建NSURL对象:用 URLSession 对象来进行网络请求。
  3. 创建URLRequest对其进行相关请求,分为GET和POST方法
  4. 根据会话创建任务
  5. 启动任务

天气预报代码示例:

// 用 NSString 创建 URL
NSString *urlString = @"https://devapi.qweather.com/v7/weather/now?location=101110101&key=487fcdf6fdc9401da0ac4c4df535f43d";
NSURL *url = [NSURL URLWithString:urlString];

// 创建 URLSession 对象
NSURLSession *session = [NSURLSession sharedSession];

// 创建 URLRequest 对其进行相关请求,这里使用 GET 方法
NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 根据会话创建任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  	//用block实现回调,处理接受的参数
    if (error) {
        NSLog(@"错误: %@", error);
        return;
    }

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    if (httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
        NSError *jsonError;
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
        if (jsonError) {
            NSLog(@"解析失败: %@", jsonError);
        } else {
            NSLog(@"数据如下: %@", json);
            // 在这里处理返回的数据
        }
    } else {
        NSLog(@"非法响应: %ld", (long)httpResponse.statusCode);
    }
}];

// 启动任务
[task resume];

在这里插入图片描述

  • NSURL:保存 Web 应用的位置信息,通常包括基地址、应用名和参数。
  • NSURLRequest:保存要发送给服务器的数据,包括 NSURL 对象,请求方法(GET、POST)、缓存策略、超时时间和额外的 HTTP 信息。NSMutableURLRequest 是其可变子类。
  • NSURLSessionTask:表示 NSURLRequest 的生命周期,追踪请求状态,并允许执行取消、暂停和继续操作。有多个子类如:NSURLSessionDataTask 用于处理普通的 HTTP 请求和响应数据,NSURLSessionUploadTask 用于上传数据,NSURLSessionDownloadTask 用于下载数据。
  • NSURLSession:作为 NSURLSessionTask 对象的工厂,用于设置任务的通用属性,如请求头、蜂窝网络下的请求权限。其委托功能强大,可追踪任务状态和处理服务器认证。

注意我们这里只是使用默认的GET方法进行最简单的网络申请,以上内容也是我在网络检索得到,对相关概念其实还是缺乏深入了解,目前也只是仅仅知道正确的网络申请流程,但不了解其原因。

网络申请数据解析

如果我们使用刚刚上面给出的链接在浏览器之中进行打开之后就可以看到以下信息了。

{
  "code": "200",
  "updateTime": "2024-08-03T15:02+08:00",
  "fxLink": "https://www.qweather.com/weather/shantou-101280501.html",
  "now": {
    "obsTime": "2024-08-03T14:56+08:00",
    "temp": "35",
    "feelsLike": "37",
    "icon": "100",
    "text": "晴",
    "wind360": "315",
    "windDir": "西北风",
    "windScale": "3",
    "windSpeed": "12",
    "humidity": "52",
    "precip": "0.0",
    "pressure": "1007",
    "vis": "30",
    "cloud": "10",
    "dew": "25"
  },
  "refer": {
    "sources": [
      "QWeather"
    ],
    "license": [
      "CC BY-SA 4.0"
    ]
  }
}

在天气预报之中我们获取天气等相关数据,获得的数据格式大多是为JSON格式,我们请求网络数据再使用相关数据进行美化之后我们就可以更加简单的对申请到的JSON进行解析。

JSON数据和OC之中的关系如下表

JSONOC
大括号—— {}NSDictionary
中括号—— []NSArray
双引号—— “”NSString
数字NSNumber

对JSON数据的解析就放在刚刚blcok的回调之中,根据JSON数据和OC之中的关系,我们可以对JSON数据进行OC的转化

那我们拿模糊搜索来举一个例子

- (void)fetchCityData {

    NSString *urlString = [NSString stringWithFormat:@"https://geoapi.qweather.com/v2/city/lookup?location=%@&key=487fcdf6fdc9401da0ac4c4df535f43d", self.searchBar.text];
    urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionDataTask *nowDataTask = [session dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData *nowData, NSURLResponse *response, NSError *nowError) {
        if (nowError) {
            NSLog(@"当前天气请求失败: %@", nowError.localizedDescription);
            return;
        }
        
        NSDictionary *nowWeatherData = [NSJSONSerialization JSONObjectWithData:nowData options:0 error:nil];
        NSArray *locationArray = nowWeatherData[@"location"];

        [self.cityArray removeAllObjects];

        for (NSDictionary *locationInfo in locationArray) {
            NSString *cityName = [NSString stringWithFormat:@"%@ - %@", locationInfo[@"name"], locationInfo[@"country"]];
            [self.cityArray addObject:@{@"name": cityName, @"id": locationInfo[@"id"]}];
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView1 reloadData];
        });
        
    }];

    [nowDataTask resume];
}

  1. 构建请求的 URL 字符串:首先,根据用户在搜索栏中输入的内容,格式化了一个包含 API 端点的 URL 字符串,包括用户输入的位置信息和 API 密钥。
  2. 对 URL 字符串进行编码:使用 stringByAddingPercentEncodingWithAllowedCharacters 方法对 URL 字符串进行编码,确保其中的特殊字符符合 URL 编码规范。
  3. 创建共享的 NSURLSession 对象:实例化了一个 NSURLSession 对象,用于执行网络请求。
  4. 创建数据任务:使用 dataTaskWithURL:completionHandler: 方法创建了一个数据任务 nowDataTask,该任务会根据提供的 URL 发起网络请求,并在请求完成后执行相应的回调处理。
  5. 启动数据任务:最后,通过调用 resume 方法启动了数据任务 nowDataTask,使其开始执行网络请求。
  6. 处理网络请求的响应数据:在任务的完成处理程序中,首先检查了是否有请求错误,如果有错误则在控制台打印错误信息;若请求成功,将返回的数据解析成 JSON 格式,并提取出其中的 location 数组。
  7. 处理返回的数据:清空了 self.cityArray 数组,然后遍历 locationArray 数组中的每个元素,提取城市名称和国家信息,将其格式化为特定的字符串,并将城市名称和对应的 ID 添加到 self.cityArray 数组中。
  8. 在主线程更新 UI:使用 dispatch_async(dispatch_get_main_queue(), ^{}将 UI 操作放入主线程队列,调用 reloadData 方法刷新 tableView1 中显示的数据。

可以看到我们在回调函数之中,我们将JSON数据转化为了字典nowWeatherData,然后将模糊搜索获得的城市名称以及其所属省份的相关数据取出,放入相关的数组之中,、并且更新我们的TableView,使得我们可以实现模糊搜索的功能。

参考文章

NSURL、NSURLRequest、NSURLSession和NSURLSessionTask

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039249.html

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

相关文章

傻瓜式一步到位Mysql 8.0 密码修改

5.7之前修改密码语句 update user set authentication_string password(“root”) where user “root”; mysql 5.7.9以后废弃了password字段和password()函数&#xff1b;并在user表加了authentication_string:字段表示用户密码 #进入到mysql 安装目录下 #停止 mysql 服务 …

低碳环保测试知识问答活动

全国生态日&#xff0c;倒计时1天。为了组织这场关于“低碳环保测试知识问答”主题的线上知识竞赛&#xff0c;我们历经从活动方案策划到落地答题小程序上线。 一、活动背景 通过举办此次知识竞赛&#xff0c;旨在提高公众对低碳环保的认识和参与度&#xff0c;推广低碳生活方…

网络协议七 应用层 DNS协议 和 DHCP协议 这两个都了解就好

应用层常见的协议 1. DNS 协议 了解 将baidu.com 解析成具体IP的协议 实际上可以理解为&#xff1a;客户端 通过 DNS 协议 和 DNS 服务器进行交互&#xff0c;将域名转换成IP 2. DHCP 协议 了解 从DHCP 服务器自动获取IP地址

P1305 新二叉树

题目&#xff1a; 洛谷传送门&#xff1a;P1305 新二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,ans; char root; struct node{char nod,r,l; }a[100000]; void dfs(char idx){cout<…

Erupt 项目搭建

创建Spring Boot项目 Maven依赖 Spring Boot版本为 2.7.10&#xff0c;erupt版本为 1.12.14 erupt版本要与Spring Boot版本适配&#xff0c;3.x.x版本Spring Boot暂不适用说是 <properties><erupt.version>1.12.14</erupt.version></properties> <…

全场景——(三)USB开发基础(1)

文章目录 一、USB 系统硬件框架和软件框架1.1 实验现象1.2 硬件框架1.3 软件框架 二、USB 电气信号2.1 USB 设备状态切换图2.2 硬件线路2.3 电子信号2.4 低速/全速信号电平2.5 高速信号电平2.6 设备连接与断开2.6.1 连接2.6.2 断开 2.7 复位2.8 设备速率识别2.8.1 低速/全速2.8…

【STM32】入门教程(完整版汇总非常详细)

本教程参考b站江协科技STM32入门教程&#xff0c;视频链接&#xff1a; 哔哩哔哩江协科技STM32入门教程https://www.bilibili.com/video/BV1th411z7sn/?spm_id_from333.337.search-card.all.click “唯一能持久的竞争优势是胜过竞争对手的学习能力。”——盖亚斯 希望对您有帮…

栈的定义及基本操作

栈的定义和特点 栈是一个特殊的线性表&#xff0c;是限定在一端进行插入和删除操作的线性表&#xff1b; 插入到栈顶称作入栈&#xff08;PUSH) 从栈顶删除最后一个元素称作出栈 &#xff08;POP&#xff09; 图1 栈的表示 假设三个元素a,b,c入栈顺序为a&#xf…

【洛谷/水滴题解】[NOIP2005 普及组] 采药

1.难度&#xff1a;普及- 2.类型&#xff1a;dp&#xff0c;01背包 3.描述&#xff0c;输入输出格式&#xff0c;样例&#xff1a; 4.AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int t,m; int dp[1005]; int main() {ios::sync_with_stdio(false…

MySQL第8讲--DCL(数据控制语言)的基本操作

文章目录 前言DCL(数据控制语言)用户管理查询用户创建用户修改用户密码删除用户 权限控制查询权限授予权限撤销权限 前言 在第六讲MySQL第6讲–DQL(数据查询语言)的基本操作之基本和条件查询和第七讲MySQL第7讲–DQL(数据查询语言)的基本操作中我们讲述了DQL中的&#xff0c;基…

高性能云桌面在工业设计中的应用,百度智能云云桌面给出答案

在之前的文章中我们讲到&#xff0c;边缘云桌面可以通过在距离用户较近的边缘节点上直接处理数据和应用&#xff0c;减少了数据传输时间&#xff0c;降低延迟&#xff0c;提高数据处理的速度和安全性。用户可以通过任何设备&#xff0c;随时随地访问自己的桌面环境&#xff0c;…

每日OJ_牛客HJ59 找出字符串中第一个只出现一次的字符

目录 牛客HJ59 找出字符串中第一个只出现一次的字符 解析代码 牛客HJ59 找出字符串中第一个只出现一次的字符 找出字符串中第一个只出现一次的字符_牛客题霸_牛客网 解析代码 可以用一个数组的每一个位置表示对应的位置。对应的字符位置存放字符出现的次数。统计完之后&…

【云备份】学习bundle库

文章目录 1.认识bundle⽂件压缩库bundle库实现⽂件压缩bundle实现文件解压缩 1.认识bundle⽂件压缩库 BundleBundle 是一个嵌入式压缩库&#xff0c;支持23种压缩算法和2种存档格式。使用的时候只需要加入两个文件 bundle.h 和 bundle.cpp 即可。 showcase #include <cass…

安全入门day.02

一、环境部署 1、windows版本 2、Linux版本 二、WEB应用组成角色名词 1、开发语言 2、程序源码 3、中间件容器 4、数据库 5、服务器操作系统 6、第三方软件 三、WEB应用安全漏洞分类 1、SQL注入 2、文件安全 3、RCE执行 4、XSS跨站 5、CSRF/SSRF/CRLF 6、反序列…

基于RK3568 Android11 移除长按电源按键弹窗的对话框中的 [关机] 和 [紧急呼救] 选项(详细分析)

一般来说&#xff0c;与Android按键窗口事件相关的基本是与frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 这个文件有关。   因此先打开与输入相关的日志&#xff0c;如下&#xff1a;   然后重新编译烧录后查看打印的日志可以看…

Matcha-Tts:一种基于条件流匹配的快速Tts架构笔记

MATCHA-TTS: A FAST TTS ARCHITECTURE WITH CONDITIONAL FLOW MATCHING笔记 提出问题&#xff1a; 1、合成速度慢 提出方法&#xff1a; 首先&#xff0c;提出了一种改进的编码器-解码器TTS架构&#xff0c;在解码器中使用1D CNN和Transformer的组合。这样减少了内存消耗&am…

使用tailwindcss轻松实现移动端rem适配

本示例节选自小卷全栈开发实战系列的《Vue3实战》。演示如何用tailwindcss所支持的rem体系轻松实现一个仿b站移动端头部导航栏rem适配。 友情声明 学习分享不易&#xff0c;如果小伙伴觉得有帮助&#xff0c;点赞支持下。满30赞&#xff0c;将随文附赠录屏讲解&#xff0c;感谢…

linux shell 脚本入门到实战

目录 一、shell入门简介1.1什么是shell1.2shell编程注意事项1.3第一个shell脚本helloworld 二、shell环境变量讲解2.1shell变量详解2.2shell系统变量介绍2.3shell环境变量介绍2.4shell用户环境变量介绍2.4.1自定义shell环境变量 三、shell编程流程控制语句3.1if条件语句介绍3.1…

TikTok出现“无网络连接”,具体原因与解决方法

“No network connection”&#xff01;当你信心满满下载并准备开始运营TikTok时&#xff0c;屏幕上如果提示“无互联网连接”非常难办。有很多因素可能会导致此问题&#xff0c;包括网络连接无效、应用程序故障等。接下来将为你盘点主要的原因与解决方法。 一、无网络连接的原…

C语言进阶(9)

程序的执行时有两种环境&#xff0c;一种是翻译环境&#xff0c;另一种是执行环境。程序先经过编译成为obj的后缀的文件&#xff0c;然后将文件和链接库链接起来&#xff0c;然后将形成可执行程序&#xff0c;前者时翻译环境&#xff0c;后者时执行环境。(链接库就是库函数的所…