【iOS】—— GET和POST以及AFNetworking框架

news2024/10/5 20:23:28

GET和POST以及AFNetworking框架

文章目录

  • GET和POST以及AFNetworking框架
  • GET和POST
      • GET和POST区别
      • GET
        • GET请求步骤
        • GET请求代码
      • POST
        • POST请求步骤
        • POST请求代码
  • AFNetworking
      • 简介
      • 添加头文件
      • GET
        • GET方法
        • GET方法参数
        • GET方法代码样例
      • POST
        • POST方法
          • 第一种:
          • 第二种:
        • 先来看第一种的使用:
        • 第二中方法的使用

GET和POST

HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。

GET和POST区别

  • 最主要的区别是GET是从API里面取数据,POST是向API里发数据。
  • GET使用URL或Cookie传参。而POST将数据放在BODY中。
  • GET的URL会有长度上的限制,则POST的数据则可以非常大。
  • POST比GET安全,因为数据在地址栏上不可见。
  • 对于GET只需要跑一趟就可以把数据传输到位,而POST则需要先去进行一个请求的过程,然后在把数据安排到位!
  • GET 安全性非常低,POST安全性较高。但是执行效率却比POST方法好。

GET

GET请求步骤

  • 确定请求路径URL(也就是后台提供的接口)。
  • 创建请求对象NSURLRequest(如不加设置请求方法和请求头,则使用默认请求头和GET请求方法)。
  • 创建会话对象NSURLSession
  • 创建请求任务NSURLSessionDataTask(根据需求选择合适的任务类型)。
  • 执行任务
  • 解析请求返回的数据

GET请求代码

    //请求 URL
    NSString* urlStr = [NSString stringWithFormat:@"https://news-at.zhihu.com/api/4/version/ios/2.3.0"];
    //封装成 NSURL
    NSURL *url = [NSURL URLWithString:urlStr];
    //初始化 请求对象
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    //也可以这样初始化对象
    //NSURLRequest* request = [NSURLRequest requestWithURL:url];
    //或者写为如下形式
    //NSMutableURLRequest *requestSecond = [NSMutableURLRequest initWithURL:url];
    //[requestSecond setHTTPMethod:@"GET"];
    
    //发送请求  默认为 GET 请求
    //1 、获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    // 2、创建请求任务
    //        第一个参数:请求对象
    //      第二个参数:completionHandler回调(请求完成【成功|失败】的回调)
    //      data:响应体信息(期望的数据)
    //      response:响应头信息,主要是对服务器端的描述
    //      error:错误信息,如果请求失败,则error有值
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
            NSLog(@"请求加载成功。。。");
            //说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)
             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        } else {
            NSLog(@"网络请求失败!");
        }
    }];
    //执行任务
    [dataTask resume];

POST

POST请求步骤

  • 确定请求路径URL(也就是后台提供的接口)。
  • 创建请求对象NSMutableURLRequest,设置请求方式为post。
  • 设置请求体,根据后台所要求的数据格式以及类型(json、xml等等)设置。
  • 若有些后台接口有请求头,则还应该设置请求头。
  • 创建会话对象NSURLSession
  • 创建请求任务NSURLSessionDataTask(根据需求选择合适的任务类型)。
  • 执行任务
  • 解析请求返回的数据

POST请求代码

    //1.创建URL对象
    NSURL *url = [NSURL URLWithString:@"你要获取的地址"];
    //2.创建请求对象
    //第一个参数是你的URL
    //第二个参数是请求的缓存策略
    //第三个参数是设置请求超时时间
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    //3.设置请求方法为post
    [request setHTTPMethod:@"POST"];
    //4.设置请求头信息
    //key(头字段名(不区分大小写)):Content-Type,
    //Value(头字段值)为下面三种:(还是得根据后台给的来设置)
    //application/x-www-form-urlencoded(后台接收为分开的参数时,如?name=liyu&password=123)
    //application/json(后台接收为json对象时)
    //multipart/form-data(上传文件时)
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    //5.设置请求体
    NSString *param = [NSString stringWithFormat:@"username = %@ & pwd = %@", self.username.text, self.pwd.text];
    //把拼接后的字符串转换为data,设置请求体(这个data就是请求体)
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
    //6.建立会话 session支持三种类型的任务
    //    NSURLSessionDataTask  //加载数据
    //    NSURLSessionDownloadTask  //下载
    //    NSURLSessionUploadTask   //上传
    NSURLSession *session = [NSURLSession sharedSession];
    //7.创建请求任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //data就是你获取到的数据,你可以自行对其进行解析
        //error就是获取失败时出现的问题
    }];
    //8.启动任务
    [dataTask resume];

AFNetworking

简介

AFNetworking作为第三方库添加方式和之前博客中提到的Masonry,JSONModel等相似。

AFNetworking是一个功能非常强大的框架,主要是用于网络请求,把复杂的原生代码封装好,我们只需要简单的几步就可以完成网络请求。

添加头文件

#import "AFNetworking.h"//主要用于网络请求方法
#import "UIKit+AFNetworking.h"//里面有异步加载图片的方法

GET

GET方法

请添加图片描述

GET方法参数

         第一个参数:NSString类型的请求路径,AFNetworking内部会自动将该路径包装为													一个url并创建请求对象
  		 第二个参数:请求参数,此处为nil
  		 第三个参数:进度回调,此处为nil
  		 第四个参数:请求成功之后回调Block
  	     第五个参数:请求失败回调Block

GET方法代码样例

    [manager GET:@"https://news-at.zhihu.com/api/4/news/before/20221023" parameters: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 失败");
    }];

POST

POST方法

第一种:

请添加图片描述

[manager POST:(nonnull NSString *) parameters:(nullable id) 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

第二种:

请添加图片描述

 [manager POST:(nonnull NSString *) parameters:(nullable id) 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:错误信息

先来看第一种的使用:

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //创建参数
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper" forKey:@"userName"];
    [self.AFNetWorkTestPOSTDictionary setObject:@"Viper333" forKey:@"passWord"];
    //发送POST请求
    [manager POST:@"要上传的URL" parameters:self.AFNetWorkTestPOSTDictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //responseObject是请求成功返回的相应结果,在AFN内部已经把相应结果转换为OC对象,通常是字典或者数组                
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"POST Failed");
    }];

第二中方法的使用

	//创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //处理非文件的参数,模拟上传账号密码
    self.AFNetWorkTestPOSTDictionary = [[NSMutableDictionary alloc] init];
    [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  constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        // 混合的数据为头像
        // 获取头像
        // 把头像转化为Data
        UIImage *image = [UIImage imageNamed:@"1.png"];
        NSData *imageData = UIImagePNGRepresentation(image);
        //在BLOCK进行参数拼接
        //ImageUp.png是上传到服务器知乎以什么方式保存
        // 什么是MIME Type : 参考博客:https://www.cnblogs.com/jsean/articles/1610265.html        
        [formData appendPartWithFileData:imageData name:@"file" fileName:@"1.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");
    }];

在其中用到了将图片转化为NSData类型并拼接上去,关于转化的方法:

 UIImage *image = [UIImage imageNamed:@"IMAGE.png"];
 NSData *imageData = UIImagePNGRepresentation(image);

将数据拼接的方法:

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

  第一个参数:要上传的文件的URL路径
  第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的
  第三个参数:该文件上传到服务后以什么名称保存
  第四个参数:该文件的MIMeType类型
  第五个参数:错误信息,传地址
[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"Image.png" mimeType:@"application/octet-stream" error:nil];

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

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

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

相关文章

[附源码]计算机毕业设计springboot防疫物资捐赠

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

springboot+jsp学生成绩查询考务系统

众所周知&#xff0c;现代信息技术是现代教育技术的基础和核心&#xff0c;培养和创新型的人才&#xff0c;必须依靠现代教育技术。从这一层意义上讲&#xff0c;我们说掌握一定的计算机应用技能已经成为国家未来的合格建设者的必备素质&#xff0c;所以现在在大学中对非计算机…

Huggingface的介绍,使用(CSDN最强Huggingface入门手册)

Huggingface的介绍&#xff0c;使用&#xff08;CSDN最强Huggingface入门手册&#xff09;返回论文和资料目录 1.Huggingface的简介 Huggingface即是网站名也是其公司名&#xff0c;随着transformer浪潮&#xff0c;Huggingface逐步收纳了众多最前沿的模型和数据集等有趣的工…

代码源每日一题div1 DP 数组划分

数组划分 - 题目 - Daimayuan Online Judge 题意&#xff1a; 思路&#xff1a; 关于位运算的最大值&#xff0c;只需要按位去贪心即可&#xff0c;即从高位向低位贪心&#xff0c;答案一定是1111000的形式 那么我们去枚举这个1和0的分界线在哪就好了 对于一个确定好的分界…

模板学堂丨DataEase用户操作日志分析大屏

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https://dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&#xff0c;并…

基于FPGA的ALU计算器verilog实现

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 Verilog HDL是一种硬件描述语言&#xff0c;以文本形式来描述数字系统硬件的结构和行为的语言&#xff0c;用它可以表示逻辑电路图、逻辑表达式…

粒子群算法查找函数最小值

实现 函数 F01、F06 的优化测试 以下内容是现有算法的运行结果、调参分析、及代码实现&#xff0c;用于给其他人提供参考&#xff0c;懒得改了hh 1. 运行结果 参数 w 0.5 &#xff08;可更改&#xff09; c1 2.0 &#xff08;可更改&#xff09; c2 2.0 &#xff08;可更改&…

2.每天进步一点点-Python爬虫需要了解一下基础的web相关内容

14天学习训练营导师课程&#xff1a; 杨鑫《Python 自学编程基础》 杨鑫《 Python 网络爬虫基础》 杨鑫《 Scrapy 爬虫框架实战和项目管理》 文章目录1.网络请求过程1.1通过 URL 查找服务器 IP1.2三次握手建立 TCP 连接1.3发送 HTTP 请求1.4服务器响应请求1.5浏览器解析 HTML1.…

21年-自研-笔试题

目录背景题目1、Object的常用方法2、 和 equals 的区别是什么&#xff1f;equals3、以下代码的运行结果4、以下代码的运行结果5、String, StringBuilder&#xff0c;StringBuffer6、ArrayList和LinkedList7、一些常用的线程安全的集合类8、以下代码的运行结果9、完成下面的代码…

Java环境准备——JDK下载和安装、IDEA下载和安装

一、JDK下载及安装 1、必要性&#xff1a;JDK是整个Java开发的核心。 2、下载网址&#xff1a;Java Downloads | Oracle 3、选择下载JDK17的原因&#xff1a;JDK17 是Java的长期支持版本。 4、下载到本地后&#xff0c;双击进行安装&#xff0c;然后点击下一步&#xff0c;安…

AI物品分类识别管理系统uniapp源码带文档教程

技术架构 技术框架&#xff1a;SpringBoot2 Mysql5.7 Mybatis-Plus uniapp Swagger2 RuoYi-fast swagger-bootstrap-ui 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 百度智能云平台服务 本地api接口端搭建教程 后端需要准备相关的IDE和JDK8开发环境 , 前…

GIT技巧

目录 基础命令 commit 、branch merge rebase 高级特性 自由修改提交树 cherry-pick rebase 远程仓库命令 基础命令 commit 、branch Git Commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照&#xff0c;就像是把整个目录复制&#xff0c;然后再粘贴一样…

Linux内核中ideapad-laptop.c文件全解析6

接前一篇文章《Linux内核中ideapad-laptop.c文件全解析5》&#xff0c;地址为&#xff1a; Linux内核中ideapad-laptop.c文件全解析5_蓝天居士的博客-CSDN博客 上一篇详细分析了ideapad_debugfs_init&#xff0c;本篇详细分析ideapad_input_init。 ideapad_input_init ideap…

Word控件Spire.Doc 【图像形状】教程(7): 如何使用 C# 在 Word 中替换图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

b站黑马JavaScript的Ajax案例代码——聊天机器人案例

目录 目标效果&#xff1a; 更换的新接口&#xff1a; 1.机器人智能回复接口&#xff1a;http://www.liulongbin.top:3006/api/robot 2.机器人语音接口&#xff1a;http://www.liulongbin.top:3006/api/synthesize 重点原理&#xff1a; 1.jQuery中trim方法 2.jquery中a…

Hive数据查询语言-DQL-含示例演练(Select查询数据、Join查询)

文章目录1. Select查询数据1.1 基础语法1.1.1 select_ecpr1.1.2 ALL、DISTINCT1.1.3 WHERE1.1.4 分区查询、分区裁剪1.1.5 GROUP BY1.1.6 HAVING1.1.7 LIMIT1.1.8 执行顺序1.2 高阶语法1.2.1 ORDER BY1.2.2 CLUSTER BY1.2.4 Union联合查询1.2.5 from子查询&#xff08;Subqueri…

Allegro自动沿着目标任意形状走线操作指导

Allegro自动沿着目标任意形状走线操作指导 Allegro有个非常好用的功能,支持自动沿着目标任意形状走线,对于异形板框走线尤其方便,以下图为例,需要沿着这个外形走一段线 具体操作如下 点击add connect命令 点击空白处 鼠标右击选择contour命令 出现一个对话框,当前是…

03【Spring AOP、CGBLIB代理】

文章目录03【Spring AOP、CGBLIB代理】一、AOP前奏1.1 案例1.1.1 需求设计1.1.2 需求修改1.1.3 需求增加1.1.4 分析存在的问题1.2 动态代理1.2.1 定义接口&#xff1a;1.2.2 日志代理类1.2.3 缓存代理类&#xff1a;1.2.4 测试类二、AOP2.1 AOP 概述2.1.1 纵向编程2.1.2 纵横配…

【Java进阶篇】第六章 IO流

文章目录一、IO流的概述1、流2、流的分类3、Java IO流的四大块4、流的两大特性5、java.io包下的16个常用流二、文件专属流1、java.io.FileInputStream2、java.io.FileOutputStream3、java.io.FileReader4、java.io.FileWriter三、缓冲流与转换流1、java.io.BufferedReader2、ja…

【面试题】深度解析Java多线程中的 run() 与 start() 有什么区别?

【面试题】深度解析Java多线程中的 run() 与 start() 有什么区别&#xff1f; 大多数人的回答 start() run() 深入底层源码的解析 run() 与 start() 为什么我们不能直接调用 run() 方法&#xff1f; 如何证明 start() 会调用 run() 方法&#xff1f; JVM -> OS执行全…