iOS - postgetAFNetworking

news2025/1/12 21:06:22

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(根据需求选择合适的任务类型)。
执行任务
解析请求返回的数据

    //请求 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(根据需求选择合适的任务类型)。
执行任务
解析请求返回的数据

    //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方法
在这里插入图片描述

         第一个参数:NSString类型的请求路径,AFNetworking内部会自动将该路径包装为													一个url并创建请求对象
  		 第二个参数:请求参数,此处为nil
  		 第三个参数:进度回调,此处为nil
  		 第四个参数:请求成功之后回调Block
  	     第五个参数:请求失败回调Block
    [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) {
        ;
    }]

第二个参数:请求参数,以字典的方式传递,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/525080.html

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

相关文章

OpenGL高级-实例化

知识点 假如你有一个有许多模型的场景&#xff0c;而这些模型的顶点数据都一样&#xff0c;只是进行了不同的世界空间的变换。想象一下&#xff0c;有一个场景中充满了草叶&#xff1a;每根草都是几个三角形组成的。你可能需要绘制很多的草叶&#xff0c;最终一次渲染循环中就肯…

每日一练 | 华为认证真题练习Day45

1、应用数据经过数据链路层处理后一定携带了MAC地址。 A. 对 B. 错 2、某网络工程师在输入命令行时提示如下信息&#xff1a; Error:Unrecognized command found at’^’position. 对于该提示信息说法正确的是&#xff1f; A. 输入命令不完整 B. 没有查找到关键字 C. 输…

LeetCode 1054 距离相等的条形码

LeetCode 1054 距离相等的条形码 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/distant-barcodes 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 在一个仓库里&#xff0c;有一排条…

二叉树总结

文章目录 树需要掌握的基本概念二叉树基本特点满二叉树性质 完全二叉树性质 二叉搜索树&#xff08;二叉排序树&#xff09;Binary Search Tree(BST)性质 平衡二叉树性质 红黑树五大性质 B树 二叉树的存储方式链式存储顺序存储 二叉树的遍历 树需要掌握的基本概念 1、节点、根…

Python+Requests+Pytest+YAML+Allure实现接口自动化

本项目实现接口自动化的技术选型&#xff1a;PythonRequestsPytestYAMLAllure &#xff0c;主要是针对之前开发的一个接口项目来进行学习&#xff0c;通过 PythonRequests 来发送和处理HTTP协议的请求接口&#xff0c;使用 Pytest 作为测试执行器&#xff0c;使用 YAML 来管理测…

如何成为Apache项目贡献者

要成为Apache Foundation的贡献者&#xff0c;您需要遵循以下步骤&#xff1a; 加入Apache社区&#xff1a;您需要加入Apache社区并成为一个活跃的成员。您可以通过订阅邮件列表、参加会议、参加社区活动等方式来加入社区。选择一个项目&#xff1a;您需要选择一个您感兴趣的A…

libevent高并发网络编程 - 03_bufferevent filter过滤器

文章目录 1. bufferevent_filter过滤器简介2. evbuffer2.1 evbuffer常用API2.2 evbuffer和bufferevent的区别 3. bufferevent filter过滤器常用API3.1 bufferevent_filter_new() 4 bufferevent filter 过滤器例子 1. bufferevent_filter过滤器简介 bufferevent filter是libeve…

探索LeetCode【0010】正则表达式匹配(未懂)

目录 0.1 题目0.2 补充示例1. 参考B站视频2. 官方答案的评论-可用3. chatGPT的思路和解法-可用 0.1 题目 题目链接&#xff1a;【0010】正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹…

UG NX二次开发(C++)-建模-删除对象

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一些测试对象3、查询这些对象的继承关系3、基于C创建的方法3.1 头文件3.2 声明删除对象的方法3.3 定义删除对象的方法3.4 填写调用代码 4、…

Vue电商项目--开发Search模块

Search模块的静态组件 search模块开发&#xff1f; 1.先静态页面静态组件拆分出来 2.发请求&#xff08;API&#xff09; 3.vuex&#xff08;三连环&#xff09; 4.组件获取仓库数据&#xff0c;动态展示数据 拆分静态组件&#xff0c;之前搞过。现在就不搞了&#xff0c;…

STL之迭代器

文章目录 什么是迭代器&#xff1f;迭代器的作用&#xff1a;为什么要使用迭代器&#xff1f;vector容器中迭代器应该怎么使用迭代器失效插入元素后失效删除元素后失效 什么是迭代器&#xff1f; 迭代器是一种检查容器内元素并且遍历容器内匀速的数据类型 迭代器的作用&#…

微服务之服务容错

Informal Essay By English Share a sentence that I think is very reasonable, as long as you can know the underlying logic of anything, you can hold it without fear 参考书籍&#xff1a; “凤凰架构” 引言 在 Martin Fowler 与 James Lewis合写的文章《Micros…

从立项到发布仅三个月,开源技术问答社区 Answer 是如何诞生的?

在祁宁家里&#xff0c;有一套完整的赛车模拟器&#xff0c;他甚至还请人到国外代购了最新的 VR 设备。作为沉浸式赛车游戏发烧友&#xff0c;除了享受速度与激情带来的愉悦感&#xff0c;祁宁在玩的过程中更多的是思考如何将技术能力进行产品化的问题。 Answer.dev 就是将技术…

【计网】第四章 网络层

文章目录 4.1-1 网络层概述4.1-2 SDN 的基本概念一、路由器功能&#xff1a;转发&#xff0c;路由选择二、数据平面三、控制平面介绍&#xff08;1&#xff09;传统方法/每路由器法&#xff08;2&#xff09;SDN 方法&#xff1a;Software-Defined Networking 四、控制平面中的…

一文掌握DTC

1. 前言 从单片机STM32开始转到汽车电子已经有一年时间了&#xff0c;到如今为止&#xff0c;很少写文章了&#xff0c;原因很简单&#xff0c;肚子里面没有墨水&#xff0c;就不给大家献丑了。而现在写在这篇文章&#xff0c;属实也是有了一定的了解。所以还不是很了解这个方…

从一到无穷大 #9 Firestore:开发者友好的Serverless NoSQL Database

引言 简单浏览了下ICDE 2023 industry-and-applications-track 部分的文章&#xff0c;其中我感兴趣的文章有三篇&#xff0c;分别为&#xff1a; Accelerating Cloud-Native Databases with Distributed PMem StoresBackward-Sort for Time Series in Apache IoTDBFirestore…

10年测开经验面试35K公司后,吐血整理出高频面试题和答案!

一&#xff1a;前言 在当今竞争激烈的职场环境中&#xff0c;拥有丰富的测试开发经验已成为众多企业青睐的重要条件之一。而在面试过程中&#xff0c;高频面试题更是能够考察应聘者的实际能力和知识水平。本文作者具备10年的测试开发经验&#xff0c;并通过面试获得了35K公司的…

VMWare16和Ubuntu20.04虚拟机安装记录

VMWare网盘链接&#xff1a;https://pan.baidu.com/s/1zZvtwnH9N47_k3pAy2dZCg 提取码&#xff1a;1234 Ubuntu下载网址&#xff1a;Ubuntu Release 推荐20.04&#xff0c;网上的教程也比较多 列举两个我参考的&#xff0c;其实都大差不差。 保姆级教程|VMware安装Ubuntu20…

Android之 activity活动页面详解

一 四大组件 1.1 Activity组件&#xff0c;它一个单独的窗口&#xff0c;程序流程都必须在Activity中运行&#xff0c;所有它是最基本的模块。 1.2 service组件&#xff0c;用于在后台完成用户指定的操作。 1.3 content provider组件&#xff0c;会为所有的应用准备一个内容…

线对象QgsLineString

几何对象中线用QgsLineString进行封装支持Z和M值&#xff0c;用于表示2维的&#xff0c;2. 5维的&#xff0c;3维的线线是由一串点连接而成 创建线 QgsLineString() #创建空的线QgsLineString(points: Iterable[QgsPoint]) #从一串QgsPoint创建QgsLineString(x: Iterable…