【iOS开发-AFNetWorking下的POST和GET】

news2025/1/21 9:01:20

文章目录

  • 写在开头
      • GET 和POST
      • GET 和POST的区别联系
      • AFNetWorking
            • 使用方法
      • DEMO
          • GET请求数据
            • GET方法
            • GET请求到的数据解析
          • POST请求
            • POST的请求测试1
            • POST请求测试二
            • 请求的数据拼接
            • POST- DEMO2
            • POST方法2参数理解
        • POST方法2的注意
            • 头像对于DATA的转换
            • 在Block里进行拼接方法
            • MIME Type的简单认识
    • 总结

写在开头

  • 最近在思考最为客户端如何和后台进行数据交互,先是了解到了GET 和POST
  • 随后了解到了iOS有一个封装好的便携的上传数据的库AFNetWorking
  • 在这里记录一下简单的方法,接下来和后台进行数据交互的时候会用到
  • AFNetWorking 基本是iOS开发中使用网络通信框架的标配,这个框架本身比较庞大,也很复杂,但是使用起来非常非常简单,在这篇博客我简单的介绍我所需要用到的AFNetWorking的POST和GET的理解,如有错误,敬请指正。

GET 和POST

  • get和post是HTTP与服务器交互的方
  • PUT,DELETE,POST,GET 他们的作用分别是对服务器资源的增,删,改,查。
  • 简答的说:GET是获取数据,POST是修改数据

GET 和POST的区别联系

  • 据了解GET和POST都是HTTP协议中的两种发送请求的方法。由于并未学习到很深入,在这里简单了解了下主要的区别。
  • GET是从服务器上获取数据,POST是向服务器传送数据。
  • GET产生一个TCP数据包;POST产生两个TCP数据包
  • 对于GET方式的请求,浏览器会把http header和Data一并发送出去,服务器响应200(返回数据);
  • 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 才会(返回数据)。
  • 我的理解就是:对于GET只需要跑一趟就可以把数据传输到位,而POST则需要先去进行一个请求的过程,然后在把数据安排到位!
  • 重要的点:GET 安全性非常低,POST安全性较高。但是执行效率却比POST方法好。

AFNetWorking

  • AFNetWorking 基本是iOS开发中使用网络通信框架的标配,这个框架本身比较庞大,也很复杂,但是使用起来非常非常简单,在这篇博客我简单的介绍我所需要用到的AFNetWorking的POST和GET的理解,如有错误,敬请指正。
使用方法
  • AFNetWorking也是属于第三方库,我们需要pod该库
pod 'AFNetworking'

请添加图片描述

DEMO

  • 添加头文件
#import "AFNetworking.h"//主要用于网络请求方法
#import "UIKit+AFNetworking.h"//里面有异步加载图片的方法
  • 对于数据我用字典存储和上传
@interface ViewController ()
@property (nonatomic, strong)NSDictionary *AFNetWorkTestGETDictionary;
@property (nonatomic, strong)NSMutableDictionary *AFNetWorkTestPOSTDictionary;
@end

请添加图片描述

GET请求数据
  • 创建网络请求对象
  • 设置请求和接收的数据编码格式
  • 设置请求头 (没有可以不需要设置)
  • 请求地址
  • 请求参数
GET方法
  • 看一下AFNetWorking提供的GET方法及其参数
    请添加图片描述
  • 参数的理解
  •          第一个参数:NSString类型的请求路径,AFN内部会自动将该路径包装为													一个url并创建请求对象
      		 第二个参数:请求参数,此处为nil
      		 第三个参数:进度回调,此处为nil
      		 第四个参数:请求成功之后回调Block
      	     第五个参数:请求失败回调Block
    
- (void)GETNet {
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 发送GET请求
    [manager GET:@"https://news-at.zhihu.com/api/4/news/before/20221023" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"GET 请求成功, %@", responseObject[@"date"]);
        self.AFNetWorkTestGETDictionary = responseObject;

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"GET 失败");
    }];
}

  • 这里我用知乎日报的URL进行测试,将GET到的数据存储到准备好的字典里面
  • self.AFNetWorkTestGETDictionary
 NSLog(@"%@", self.AFNetWorkTestGETDictionary);

请添加图片描述

GET请求到的数据解析
  • 这里就算是用GET方法请求成功了,对于AFN内部responseObject是请求成功返回的相应结果,在AFN内部已经把相应结果转换为OC对象,通常是字典或者数组,我直接进行了字典赋值
self.AFNetWorkTestGETDictionary = responseObject;

也可以这样

        // 转化为字典
        NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
        
POST请求
  • AFN提供了POST的两种方法,由简单到复杂,这里以2个DEMO为例
[manager POST:(nonnull NSString *) parameters:(nullable id) headers:(nullable NSDictionary<NSString *,NSString *> *) progress:^(NSProgress * _Nonnull uploadProgress) {
        ;
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        ;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        ;
    }]
 [manager POST:(nonnull NSString *) parameters:(nullable id) headers:(nullable NSDictionary<NSString *,NSString *> *) constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        ;
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        ;
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        ;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        ;
    }]
POST的请求测试1
  • 这里对应的是方法1
- (void)POSTNet {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //创建参数
    //
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper" forKey:@"userName"];
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper333" forKey:@"passWord"];
    //发送POST请求
    [manager POST:@"https://news-at.zhihu.com/api/4/news/before/20221023" parameters:self.AFNetWorkTestPOSTDictionary headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //responseObject是请求成功返回的相应结果,在AFN内部已经把相应结果转换为OC对象,通常是字典或者数组
        
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"POST Failed");
    }];
}
  • 这里如果只是简单的请求,和GET是一样的,方法的参数理解如下
[manager POST:(nonnull NSString *) parameters:(nullable id) headers:(nullable NSDictionary<NSString *,NSString *> *) progress:^(NSProgress * _Nonnull uploadProgress) {
        ;
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        ;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        ;
    }]

 第一个参数:NSString类型的请求路径,AFN内部会自动将该路径包装为一个url并创建请求对象
 第二个参数:请求参数,以字典的方式传递,AFN内部会判断当前是POST请求还是GET请求,以选择直接拼接还是转换为NSData放到请求体中传递
 第三个参数:进度回调 此处为nil
 第四个参数:请求成功之后回调Block
 第五个参数:请求失败回调Block
POST请求测试二
  • 对应AFN提供的第二个方法
  • 我还想到了当你作为一个用户的时候不仅仅需要传输的用户的账户信息,可能也涉及到用户头像的上传,这里AFN库也提供了一种拼接数据然后上传的方法
  • 这里以一个用户的账号密码和头像混合上传为例
请求的数据拼接
  • AFN提供了三种数据拼接的方法如下

 1
  第一个参数:要上传的文件二进制数据
  第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的
  第三个参数:该文件上传到服务后以什么名称保存
  第四个参数:该文件的MIMeType类型
[formData appendPartWithFileData:data name:@"file" fileName:@"Image.png" mimeType:@"application/octet-stream"];


 2
  第一个参数:要上传的文件的URL路径
  第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的
  第三个参数:该文件上传到服务后以什么名称保存
  第四个参数:该文件的MIMeType类型
  第五个参数:错误信息,传地址

[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"Image2.png" mimeType:@"application/octet-stream" error:nil];


 3
  第一个参数:要上传的文件的URL路径
  第二个参数:文件参数对应的参数名称,此处为file
  第三个参数:错误信息
[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];

POST- DEMO2
- (void)upLoad {
    //创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //处理非文件的参数,模拟上传账号密码
    self.AFNetWorkTestPOSTDictionary = [[NSMutableDictionary alloc] init];
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper" forKey:@"userName"];
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper333" forKey:@"passWord"];
    //发送POST请求上传文件
    [manager POST:@"目标的URL" parameters:self.AFNetWorkTestPOSTDictionary headers:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        // 混合的数据为头像
        // 获取头像
        // 把头像转化为Data
        UIImage *image = [UIImage imageNamed:@"IMG_2400.png"];
        NSData *imageData = UIImagePNGRepresentation(image);
        //在BLOCK进行参数拼接
        //ImageUp.png是上传到服务器知乎以什么方式保存
        // 什么是MIME Type : 参考博客:https://www.cnblogs.com/jsean/articles/1610265.html
        [formData appendPartWithFileData:imageData name:@"file" fileName:@"ImageUp.png" mimeType:@"image/png"];
        //[formData appendPartWithFileURL:fileUrl name:@"file"fileName:@"Image7.png" mimeType:@"image/png" error:nil];
        //[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        //        progress 进度回调;
        //uploadProgress.completedUnitCount:已经上传的数据大小
        //uploadProgress.totalUnitCount:数据的总大小
        NSLog(@"%f", 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"POST UP Succeed!");
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"POST UP Failed");
    }];
}
  • 注意在之前讲到的参数拼接是在constructingBodyWithBlock进行参数拼接,需要对图片进行一个DATA的转化,下面会解释
POST方法2参数理解
 [manager POST:(nonnull NSString *) parameters:(nullable id) headers:(nullable NSDictionary<NSString *,NSString *> *) constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        ;
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        ;
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        ;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        ;
    }]
对参数的理解
 第一个参数:请求路径(NSString类型)
 第二个参数:非文件参数,以字典的方式传递
 第三个参数:constructingBodyWithBlock 在该回调中拼接文件参数
 第四个参数:progress 进度回调
 uploadProgress.completedUnitCount:已经上传的数据大小
 uploadProgress.totalUnitCount:数据的总大小
 第五个参数:success 请求成功的回调
 task:上传Task
 responseObject:服务器返回的响应体信息
 第六个参数:failure 请求失败的回调
 task:上传Task
 error:错误信息

POST方法2的注意

头像对于DATA的转换
  • 在学习第二种POST方法的过程中有几个需要说明的点
  • 如何把头像转化为DATA:
    • 获取图像
    • 把头像转化为DATA
 UIImage *image = [UIImage imageNamed:@"IMG_2400.png"];
        NSData *imageData = UIImagePNGRepresentation(image);
  • UIImagePNGRepresentation和UIImageJPEGRepresentation方法
    请添加图片描述

UIKIT_EXTERN  NSData * __nullable UIImagePNGRepresentation(UIImage * __nonnull image);                               // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
-将图像返回为PNG。如果图像没有CGImageRef或位图格式无效,则可能返回nil
UIKIT_EXTERN  NSData * __nullable UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality);  // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
- /以JPEG格式返回图像。如果图像没有CGImageRef或位图格式无效,则可能返回nil。压缩为0(最多)..1(最少)

在Block里进行拼接方法
[formData appendPartWithFileData:imageData name:@"file" fileName:@"ImageUp.png" mimeType:@"image/png"];
  • 理解:appendPartWithFileData 这里是刚才图片转换过去的Data,
  • fileName是上传到服务器以什么方式保存
MIME Type的简单认识
  • 在POST方法BLOCK里面拼接里对最后一个参数mimeType的参考,查询之后在这里简单解释一下
  • 在浏览器中显示的内容有 HTML、有 XML、有 GIF、还有 Flash ……那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME Type,也就是该资源的媒体类型。
  • 媒体类型通常是通过 HTTP 协议,由 Web 服务器告知浏览器的,更准确地说,是通过 Content-Type 来表示的,例如:`Content-Type: text/HTML
  • 示内容是 text/HTML 类型,也就是超文本文件。为什么是“text/HTML”而不是“HTML/text”或者别的什么?MIME Type 不是个人指定的,是经过 ietf 组织协商,以 RFC 的形式作为建议的标准发布在网上的,大多数的 Web 服务器和用户代理都会支持这个规范 (顺便说一句,Email 附件的类型也是通过 MIME Type 指定的)。
    在这里插入图片描述

总结

  • 通过今天的学习初步认识到了客户端和后台的交互是如何进行的,接下来的项目里会不断的了解和深入学习交互方法
  • 写的博客如有不正确,敬请指正。

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

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

相关文章

QFileInfo(文件信息)和临时文件

QFileInfo提供有关文件在文件系统中的名称和位置&#xff08;路径&#xff09;&#xff0c;其访问权限以及它是目录还是符号链接等的信息。文件的大小和上次修改/读取时间也可用。QFileInfo还可用于获取有关Qt资源的信息 QFileInfo可以指向具有相对或绝对文件路径的文件。绝对…

FFmpeg实现fmp4+h265 aac切片命令

目录 背景 环境 FFmpeg实现fmp4h265 aac切片命令 使用go创建hls server 使用hls.js demo播放 播放地址&#xff1a;hls.js demo 背景 Chrome在104/105版本后&#xff0c;支持硬解h265&#xff0c;使得hls利用浏览器硬解特性播放h265视频。hls官方要求h265必须使用fmp4格…

Yolov5算法解读

yolov5于2020年由glenn-jocher首次提出&#xff0c;直至今日yolov5仍然在不断进行升级迭代。 Yolov5有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本。文件中&#xff0c;这几个模型的结构基本一样&#xff0c;不同的是depth_multiple模型深度和width_multiple模型宽度这两个参…

[网络] TCP协议中的三次握手是什么?利用3次握手的SYN Flood DDOS攻击知道吗?

文章目录前言术语TCP协议三次握手的由来网络协议里的握手阶段Sequence Number是什么&#xff1f;TCP协议三次握手都发送了什么数据&#xff1f;TCP数据包长什么样&#xff1f;SYN Flood DDOS攻击是什么&#xff1f;结语前言 介于TCP协议中三次握手经常会被问到&#xff0c;以及…

NBA体育决策和数据挖掘分析

业务挑战 体育运用大数据主要体现在以下三个方面&#xff1a; 预测比赛结果和奖牌归属&#xff1b;更好地训练运动员 。数据和模型驱动体育决策让获胜和成功变得更有可能&#xff0c;体育统计(Sports Analytics)成为体育竞争的“杀手锏”。最近我们被客户要求撰写关于体育统计…

鲲鹏devkit性能分析工具介绍(一)

鲲鹏devkit性能分析工具介绍&#xff08;一&#xff09; 鲲鹏性能分析工具由四个子工具组成&#xff0c;分别为&#xff1a;系统性能分析、Java性能分析、系统诊断和调优助手。 系统性能分析是针对基于鲲鹏的服务器的性能分析工具&#xff0c;能收集服务器的处理器硬件、操作…

从2022安洵杯[babyPHP]看Soap+CLRF造成SSRF漏洞

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、PHP SOAP 二、漏洞成因 三、 题目知识准备 1、PHP Session反序列化 2、题目相关函数 四、[LCTF 2018]bestphps revenge 五、2022安洵杯 BabyPHP 前言 …

基于ASP.net的服装商城设计

目录 海秀衣城系统 2 1.概 述 2 1.1 网上购物的发展 2 1.2 三层架构技术简介 2 2. 系统总体设计 4 2.1 开发以及运行环境 4 2.2项目结构分析 4 2.3系统功能总体结构图 5 2.4系统功能结构分解图 5 3. 数据库设计 6 3.1 数据库设计 6 3.2 数据表 7 4. 模块设计 10 4.1 前端功能模…

SpringCloud微服务实践之七 网关(Gateway)

一、网关基本概念 &#xff08;一&#xff09;网关功能 身份认证和权限校验服务路由、负载均衡请求限流 &#xff08;二&#xff09;网关技术选型 SpringCloud提供了两个组件都可以实现网关功能&#xff1a; gatewayzuul 其中&#xff0c;Zuul是基于Servlet的实现&#xff…

SQL注入漏洞 | 数字型

文章目录前言MySQL 数字型前言 SQL注入漏洞 | iwebsec MySQL 数字型 页面观察&#xff1a;测试看回显 注入点判断&#xff1a;发现有sql注入漏洞 AND 可在 where 子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立&#xff0c;则 AND 运算符显示一条记录…

HBuilder X实现tabBar底部导航记录

首先&#xff0c;打开uniapp官网&#xff0c;找到tarbar官方文档&#xff0c;仔细阅读&#xff0c;具体位置如下&#xff0c;全局配置下面的pages.json页面路由里面找到tabBar&#xff0c;点击查看&#xff1a; 重点注意这两句话&#xff1a; 找到文档我们就可以按照上面的提示…

迭代器模式(Iterator)

参考&#xff1a; 迭代器设计模式 (refactoringguru.cn) [design-patterns-cpp/Iterator.cpp at master JakubVojvoda/design-patterns-cpp GitHub 文章目录一、什么是迭代器模式&#xff1f;二、实现三、优缺点优点缺点一、什么是迭代器模式&#xff1f; 提供一种方法&…

QFont-使用外部字体文件的问题

我们程序里面定义了某个结构体(这里简单描述为AStruct)&#xff0c;AStruct包含了一个QFont 类型的成员变量&#xff1a; struct AStruct {QFont ft; }; 在具体业务上&#xff0c;AStruct中的QFont会被传递给QPainter去绘制文本。 保存工程/加载工程时时&#xff0…

用Python写个爬虫,赚了!

前言 编程语言排行榜(Tiobe)发布了11月新榜&#xff0c;Python仍领先Java和C&#xff0c;在全球众多的老牌编程语言中&#xff0c;以其他对手无法企及的极高份额稳居榜单第一位。 榜单数据是客观真实的&#xff0c;当下Python的使用者越来越多&#xff0c;已经远超使用其他十…

【Linux初阶】认识冯诺依曼结构

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;计算机的冯诺依曼组成结构、冯诺依曼结构的数据交换特性&#xff0c;以宏观视角理解冯诺依曼下的网络数据传输…

Spring Cloud Alibaba 容器化部署最佳实践 | 本地部署版本详解

环境声明 在运行本地示例之前&#xff0c;需要保证本机具备以下的基础环境&#xff0c;如果您的本地没有当前的环境&#xff0c;下面会一步步进行搭建&#xff0c;演示搭建过程。 Nacos 服务端Seata 服务端RocketMQ 服务端MySQL 服务端 可在国内https://gitee.com/mirrors/S…

低代码在离散制造业的实践

大家上午好&#xff0c;非常感谢明道云给我这个机会&#xff0c;来展示一下这个上海电气在明道云上面的应用。我的题目是《低代码在离散制造业的实践》。 引入明道云的背景 首先介绍一下我们电气数字科技有限公司。它是在2018年的时候&#xff0c;上海电气集团内部成立的数科…

捷码全新快速表单功能解读

在最近的更新中&#xff0c;捷码迎来了比较多的功能上新&#xff0c;其中最受大家关注的是全新的表单功能。无论是从功能丰富度还是操作便利性上都做了大量设计。本文将从重点功能设置操作流程上进行演示说明。 表单控件和关联 ——1对1、1对n、n对n 支持多场景 首先是表单控…

航空货运数据挖掘那些事|航班换季

目录前言航班换季航班换季对航空货运业务有哪些影响参考文献前言 就在上个月月底&#xff0c;即2022年10月29日到2022年10月30日&#xff0c;中国民航完成了2022年的夏秋季航季到2022/23年冬春航季切换工作&#xff0c;俗称航班换季&#xff0c;那么何为航班换季呢&#xff0c…

流媒体传输 - RTMP 协议

RTMP 是 Real Time Messaging Protocol&#xff08;实时消息传输协议&#xff09;的首字母缩写。它是由 Adobe 公司提出的一种应用层的协议&#xff0c;用来解决多媒体数据传输流的多路复用&#xff08;Multiplexing&#xff09;和分包&#xff08;packetizing&#xff09;的问…