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

 

posted @ 2016-12-09 11:37  侯文超  阅读(325)  评论(0编辑  收藏  举报