iOS学习----------AFNetworking(3)request创建《post请求》

本文探讨了在iOS开发中使用AFNetworking进行POST请求的两种方式,特别是`multipartFormRequestWithMethod`方法及其内部实现。通过构建自定义请求头和处理HTTPBodyStream,确保了请求的正确发送。同时提到了`requestWithMultipartFormRequest`方法,虽然在AFN中未使用,但解释了其用于解决NSURLSessionTask的一个已知问题。
摘要由CSDN通过智能技术生成

1、发送post请求时,构建的requset使用的方法为
- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters constructingBodyWithBlock:(void (^)(id formData))block error:(NSError __autoreleasing )error

- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block        error:(NSError *__autoreleasing *)error
{
    NSParameterAssert(method);
    NSParameterAssert(![method isEqualToString:@"GET"] && ![method isEqualToString:@"HEAD"]);

   //先调用requestWithMethod方法来设置head 和 序列化参数
   //这时参数放在body中:[mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]]

    NSMutableURLRequest *mutableRequest = [self requestWithMethod:method URLString:URLString parameters:nil error:error];

//创建formData,这个formData绑定一个request、stringEncoding、boundary(分割线)、AFMultipartBodyStream(数据)
//AFMultipartBodyStream中包含:AFHTTPBodyPart(当前的bodyPart)、HTTPBodyParts(bodyPart的数量)...
    __block AFStreamingMultipartFormData *formData = [[AFStreamingMultipartFormData alloc] initWithURLRequest:mutableRequest stringEncoding:NSUTF8StringEncoding];

    if (parameters) {
        for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {
            NSData *data = nil;
            if ([pair.value isKindOfClass:[NSData class]]) {
                data = pair.value;
            } else if ([pair.value isEqual:[NSNull null]]) {
                data = [NSData data];
            } else {
                data = [[pair.value description] dataUsingEncoding:self.stringEncoding];
            }

            if (data) {
                [formData appendPartWithFormData:data name:[pair.field description]];
            }
        }
    }

    if (block) {
        block(formData);
    }
//构建multipart的请求头
    return [formData requestByFinalizingMultipartFormData];
}

multipart除了使用普通协议请求头的构建方法。还会在- [AFStreamingMultipartFormData requestByFinalizingMultipartFormData]构建自己独有的请求头。下面详细看这个方法

//创建请求头
- (NSMutableURLRequest *)requestByFinalizingMultipartFormData {
    if ([self.bodyStream isEmpty]) {
        return self.request;
    }

    //如果boduStream中有多个AFHTTPBodyPart 那么便利将每个AFHTTPBodyPart的前后分割线去掉,只在整个bodyStream的HTTPBodyParts数组的第一个和最后一个加上分割符
    [self.bodyStream setInitialAndFinalBoundaries];
    [self.request setHTTPBodyStream:self.bodyStream];
//    self.request.HTTPBodyStream = self.bodyStream;

    //构建请求头
    [self.request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", self.boundary] forHTTPHeaderField:@"Content-Type"];
    [self.request setValue:[NSString stringWithFormat:@"%llu", [self.bodyStream contentLength]] forHTTPHeaderField:@"Content-Length"];
    return self.request;
}

self.boundary:分割线

//分隔符的创建
static NSString * AFCreateMultipartFormBoundary() {
     // 使用两个十六进制随机数拼接在Boundary后面来表示分隔符
    return [NSString 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值