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; }