【iOS开发-AFNetWorking下的POST和GET】
文章目录
- 写在开头
- 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) {// 混合的数据为头像// 获取头像// 把头像转化为DataUIImage *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:上传TaskresponseObject:服务器返回的响应体信息第六个参数:failure 请求失败的回调task:上传Taskerror:错误信息
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 指定的)。
总结
- 通过今天的学习初步认识到了客户端和后台的交互是如何进行的,接下来的项目里会不断的了解和深入学习交互方法
- 写的博客如有不正确,敬请指正。
【iOS开发-AFNetWorking下的POST和GET】相关推荐
- iOS开发--Mac下server搭建
前言 对于Mac电脑的认识.我一直停留在装B神器的意识上.就在前两天我彻底改变了庸俗的看法,当时忙着写毕业设计.苦于iOS开发没有server, 数据都是从网上抓取或本地plist文件,感觉不够高大上 ...
- [iOS开发]AFNetworking源码学习
目录 简介 开始解读 核心类 AFURLSessionManger 作用 属性和接口方法 代理 AFURLSessionManagerTaskDelegate _AFURLSessionTaskSwi ...
- iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
转:http://www.xue5.com/Mobile/iOS/747036.html 之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决 ...
- iOS开发 -------- AFNetworking使用中遇到的小问题
1 在使用的时候会经常出现如下图打印信息,导致请求的数据不能正常显示出来 2 此时找到AFJSONResponseSerializer类,找到箭头标识的位置 3 在下图标识的位置,往集合里面添加 元素 ...
- iOS开发——自定义下拉框
先搭好架子,这几天填充. 转载于:https://www.cnblogs.com/yyt-hehe-yyt/p/5443123.html
- iOS资源帖-优秀博客、iOS开发技术文、学习网站
原链接:https://www.jianshu.com/p/619c61d9c8fb 一些博客 王巍 Objc中国发起人.Line工程师 ibireme YYKit作者 bang JSPatch作者 ...
- 学习ios(必看经典)牛人40天精通iOS开发的学习方法
亲爱的学员们: 如今,各路开发者为淘一桶金也纷纷转入iOS开发的行列.你心动了吗?想要行动吗?知道如何做嘛?速来学习由51CTO学院整理的iOS精品视频集,42个视频课程一步步引领你成为一名iO ...
- 学习ios牛人40天精通iOS开发的学习方法
学习ios(必看经典)牛人40天精通iOS开发的学习方法 描述 这是一套从一个对iOS开发感兴趣的学员到iOS开发高手的系统.专业的课程体系.以培养企业开发真正需要的人才为目标,每个知识点都用案例来讲 ...
- 【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
原文网址:http://bbs.51cto.com/thread-1099956-1.html 亲爱的学员们: 如今,各路开发者为淘一桶金也纷纷转入iOS开发的行列.你心动了吗?想要行动吗?知道如何做 ...
最新文章
- java9String类简单了解
- 带你学习JQuery:事件冒泡和阻止默认行为
- 使用多级分组报表展现分类数据
- mysql 多行拼接注入_MySQL注入汇总
- ajax回显500因为#与$的原因
- SOCKET 478/775是两种主板的CPU接口类型
- 网页编写练习 小米闪购
- 音频怎么转换成mp3格式
- python怎么加字幕_使用moviepy为电影添加字幕
- 离散数学中求合取范式析取范式
- html 磁贴自动布局,也来“玩”Metro UI之磁贴(一)_html/css_WEB-ITnose
- 少数民族高考成绩查询2021,2021少数民族高考加多少分?
- matlab s域转时域,时域 S域 Z域转换
- 别再自己抠图了,3行Python代码实现图像照片抠图和换底色的方法
- 2020年Web前端学习网站导航
- Typora初步学习
- 微pe工具箱+软碟通 制作 U盘启动盘
- 服务器屏幕不全屏显示,服务器窗口显示不全屏
- 淘宝百亿补贴入口在哪里怎么进入领取淘宝百亿补贴优惠券?
- 迭代求解线性方程组的解
热门文章
- 监控摄像头镜头可视距离和角度
- Java开发面试题目,java中级面试题及答案下载
- 夏日出行好伴侣,华为FreeBuds 4堪称清凉好装备
- 【论文阅读】WMH Segmentation Challenge 2017 及第一名解决方案
- 2020年中国丙烯产能产量、进出口及需求现状分析,“十四五”进口缺口将继续缩小「图」
- 怎么开发一个自助打印机小程序
- 天气调用php代码,天气调用代码
- 【Python——链表】
- 适用ios,android,wp等平台手机emoji表情符号兼容方案
- 20个MATLAB高级数据可视化案例-MATLAB高级绘图教程