当前位置: 首页 > news >正文

AFURLRequestSerialization

NSString * AFPercentEscapedStringFromString(NSString *string)   //去除非法字符并且对特殊字符进行编码。  //对字符串进行百分比编码

 

有两个协议<AFURLRequestSerialization>   | |    <AFMultipartFormdata>

AFHTTPRequestSerializer  <AFURLRequestSerialization>

实现{

  1.设置HTTPHeaders

  2.判断有没有参数, 如果有, 优先走自定义的格式化参数设置, 没有自定义则拼接成key1=value1&key2=value2这样的字符串

  3.如果是get, head, delete就把格式化之后的参数拼接在url后面, 否则就设置成httpBody请求体

}

 

对于multipart表单提交,请求会是如下这样的:

请求header的Content-Type必需是这样的Content-Type: multipart/form-data; boundary=${bound}。${bound}是一个占位符,它可以是任意字符串。它是表单中每一part的分隔符。每一部分的内容都以--${bound}作为开始并以\r\n结束,并且每一部分的内容都有它自己的header信息。最后会以--${bound}--作为所有内容都结束的标记。下面就是一个multipart表单提交的格式。

 

--${bound}  
Content-Disposition: form-data; name="name"  
HTTP.pdf  
--${bound}  
Content-Disposition: form-data; name="name2"; filename="xxx" 
data --${bound}  
Content-Disposition: form-data; name="uploaddata"  
uploaddata  
--${bound}--  

 

 

//AFMultipartBodyStream的read:maxLength:
//由系统的回调调到AFMultipartBodyStream的read,取数据实际再从AFHTTPBodyPart去拿,AFMultipartBodyStream作用只中间桥梁
- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)length
{
    if ([self streamStatus] == NSStreamStatusClosed) {
        return 0;
    }

    NSInteger totalNumberOfBytesRead = 0;
    while ((NSUInteger)totalNumberOfBytesRead < MIN(length, self.numberOfBytesInPacket)) {
        //判断读满了length没有
        if (!self.currentHTTPBodyPart || ![self.currentHTTPBodyPart hasBytesAvailable]) {
            //当前的part为空或不可读取数
            
            if (!(self.currentHTTPBodyPart = [self.HTTPBodyPartEnumerator nextObject])) {
                //已经读到最后一部份就退出了
                break;
            }
        } else {
        //可读,计算还可以读取到buf中的最大长度maxLength,和buf的什么位置开始写进去即&buffer[totalNumberOfBytesRead]
            NSUInteger maxLength = MIN(length, self.numberOfBytesInPacket) - (NSUInteger)totalNumberOfBytesRead;
            
            //从当前可读的HTTPBodyPart读取数据
            NSInteger numberOfBytesRead = [self.currentHTTPBodyPart read:&buffer[totalNumberOfBytesRead] maxLength:maxLength];
            //-1表示读取出错了
            if (numberOfBytesRead == -1) {
                self.streamError = self.currentHTTPBodyPart.inputStream.streamError;
                break;
            } else {
                //读取成功后当前已经读的要加上实际读的长度numberOfBytesRead,然后再回到循环判断读满了length没有
                totalNumberOfBytesRead += numberOfBytesRead;

                if (self.delay > 0.0f) {
                    [NSThread sleepForTimeInterval:self.delay];
                }
            }
        }
    }
    return totalNumberOfBytesRead;
}

 

转载于:https://www.cnblogs.com/lion-witcher/p/6148846.html

相关文章:

  • top命令简介
  • 竟然发现在windows2003下的搜索工具不能搜索asp文件中的select文字
  • Android高级之十二讲之内存、电量、卡顿、流量
  • 邮件
  • Linux系统环境变量
  • 事务处理行为
  • LeetCode - Linked List Cycle I II
  • Google实用技巧
  • NOIP2001 一元三次方程求解[导数+牛顿迭代法]
  • InnoDB与MyISAM的区别
  • Windows XP sp2全攻略
  • HTML+CSS基础
  • 类ExampleA继承Exception,类ExampleB继承ExampleA。 有如下代码片断:
  • 【Linux】find grep 联合使用 过滤所有子目录、文件
  • 如何给DataGrid添加自动增长列
  • JavaScript 一些 DOM 的知识点
  • js 实现textarea输入字数提示
  • leetcode388. Longest Absolute File Path
  • Promise面试题2实现异步串行执行
  • Redis在Web项目中的应用与实践
  • Redis中的lru算法实现
  • vue-router 实现分析
  • 漂亮刷新控件-iOS
  • 前端技术周刊 2019-02-11 Serverless
  • 前端面试之CSS3新特性
  • 前嗅ForeSpider教程:创建模板
  • 三栏布局总结
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 通信类
  • (HAL库版)freeRTOS移植STMF103
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)JAVA使用POI操作excel
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十三)Flask之特殊装饰器详解
  • (一)Java算法:二分查找
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @property python知乎_Python3基础之:property
  • [ C++ ] STL---stack与queue
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [C#] 如何调用Python脚本程序
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CQOI 2010]扑克牌
  • [Godot] 3D拾取