iOS开发网络请求之表单拼接

当服务器定义的Content-Typemultipart/form-data;的时候我们使用原生的URLSession进行网络请求的时候,我们需要进行表单拼接,下面记录一下:

1、在URLRequest中设置表单分割标识

request.addValue("multipart/form-data; boundary="+"\(boundary)", forHTTPHeaderField: "Content-Type") 
 // boundary 表单分割标识
其中" boundary " 是我自己生成的一个随机字符串作为表单的分割标识

2、表单拼接。下面是我上传图片的时候所拼接的一个表单数据

swift 版本
 /*
     fileData: 文件数据
     fileName:文件名称
     params:其他的参数
     */
    func getBodyData(fileData:Data,fileName:String,params:Dictionary<String, Any>?)->Data{
        
        let KNewLineString = "\r\n"
        let KNewLine:Data =  KNewLineString.data(using: String.Encoding.utf8)!
        var bodyData:Data = Data()
        let Kboundary = "--" + boundary
        // 开始拼接其他参数
        if !(params?.isEmpty)! {
            for keys in params!.keys {
                bodyData.append(Kboundary.data(using: String.Encoding.utf8)!)
                bodyData.append(KNewLine)
                let keysString = "Content-Disposition: form-data; name=\""+keys+"\""
                bodyData.append(keysString.data(using: String.Encoding.utf8)!)
                bodyData.append(KNewLine)
                bodyData.append(KNewLine)
                bodyData.append((params![keys] as! String).data(using: String.Encoding.utf8)!)
                bodyData.append(KNewLine)
            }
        }
        // 开始拼接图片数据
        bodyData.append(Kboundary.data(using: String.Encoding.utf8)!)
        bodyData.append(KNewLine)
        let configString = "Content-Disposition: form-data; name=\"file\"; filename=\""+"\(fileName)"+"\""
        bodyData.append(configString.data(using: String.Encoding.utf8)!)
        bodyData.append(KNewLine)
        let contentTypeString = "Content-Type:image/jpge,image/gif, image/jpeg, image/pjpeg, image/pjpeg"
        bodyData.append(contentTypeString.data(using: String.Encoding.utf8)!)
        bodyData.append(KNewLine)
        bodyData.append(KNewLine)
        bodyData.append(fileData)
        bodyData.append(KNewLine)
        // 数据拼接结束
        bodyData.append(Kboundary.data(using: String.Encoding.utf8)!)
        return bodyData
    }
Objective-C 版本
/*
     fileData: 文件数据
     fileName:文件名称
     params:其他的参数
     */
- (NSData *)getBodyDataWithFileData:(NSData *)fileData fileName:(NSString *)fileName params:(NSDictionary *)params{
    NSString *KNewLineString = @"\r\n";
    NSData *KNewLine = [KNewLineString dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableData *bodyData = [[NSMutableData alloc] init];
    NSString *Kboundary = [[NSString alloc] initWithFormat:@"--%@",boundary];

    // 开始拼接其他参数
    for(NSString *keys in params.allKeys){
        [bodyData appendData:[Kboundary dataUsingEncoding:NSUTF8StringEncoding]];
        [bodyData appendData:KNewLine];
        NSString *string = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"",keys];
        [bodyData appendData:[string dataUsingEncoding:NSUTF8StringEncoding]];
        [bodyData appendData:KNewLine];
        [bodyData appendData:KNewLine];
        NSString *value = [NSString stringWithFormat:@"%@",[params valueForKey:keys]];
        [bodyData appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];
        [bodyData appendData:KNewLine];
    }
    
    // 开始拼接图片数据
    [bodyData appendData:[Kboundary dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:KNewLine];
    NSString *configString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"",fileName];
    [bodyData appendData:[configString dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:KNewLine];
    NSString *contentTypeString = @"Content-Type:image/jpge,image/gif, image/jpeg, image/pjpeg, image/pjpeg";
    [bodyData appendData:[contentTypeString dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:KNewLine];
    [bodyData appendData:KNewLine];
    [bodyData appendData:fileData];
    [bodyData appendData:KNewLine];
    
    // 拼接数据结束
    [bodyData appendData:[Kboundary dataUsingEncoding:NSUTF8StringEncoding]];
    
    return bodyData;
}
}

随机字符串生成

swift版本
 /*
     length: 产生随机数长度
     isContainNum: 是否包含数字
     */
    func getRandomString(length:Int,isContainNum:Bool) -> String{
        var charArray:[CChar] = Array(repeating: 0, count: length)
        for index in 0..<length {
            var num = isContainNum ? arc4random_uniform(75) + 48 : arc4random_uniform(58) + 65
            if num > 57 && num < 65 && isContainNum == true{
                num = num%57+48  // 过滤ASCII值为58~64之间的字符
            }else if num > 90 && num < 97 {
                num = num%90 + 65 // 过滤ASCII值为91~96之间的字符
            }
            charArray[index] = CChar(num)
        }
        return String(cString: charArray)
    }
Objective-C 版本
- (NSString *)getRandomStringWithLength:(int)length isContainNum:(BOOL)isContainNum{
    NSString *resultStr = [[NSString alloc] init];
    for (NSInteger i = 0; i< length; i++) {
        NSInteger num = isContainNum ? arc4random_uniform(75)+48:arc4random_uniform(58)+65;
        if (num > 57 && num < 65 && isContainNum){
            num = num%57+48; // 过滤ASCII值为58~64之间的字符
        }else if (num > 90 && num < 97){
            num = num%90+65;
        }
        resultStr = [resultStr stringByAppendingFormat:@"%c",num];
    }
    
    return  resultStr;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容