IOS propio paquete Mutipart una solicitud de red

iOS propia asamblea solicitudes de red multiparte

¿Cuál es la solicitud Mutipart red

mutipart red solicita una petición de red es un post, principalmente para subir archivos grandes como imágenes, datos de audio y vídeo y similares;

Se necesita sus propias solicitudes de red de montaje mutipart bajo qué condiciones

proyecto general de nuestras solicitudes de red se basan en los marcos web de terceros, tales como AFNetworking, pero si escribimos SDK o de demostración, no quiero citar también muchos de terceros, se necesita poseer solicitud de ensamblaje mutipart;

AFNetwoking solicitud basada en la red mutipart

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(nullable id)parameters
     constructingBodyWithBlock:(nullable void (^)(id <AFMultipartFormData> formData))block
                       success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                       failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE;

Por @protocol AFMultipartFormDatala adición de datos a cuerpo requet con el siguiente protocolo;

- (void)appendPartWithFileData:(NSData *)data
                          name:(NSString *)name
                      fileName:(NSString *)fileName
                      mimeType:(NSString *)mimeType;

El código de ejemplo

[manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        
        
        
        switch (fileType) {
            case DBUploadFileTypeWAV:{
                NSData *data = [NSData dataWithContentsOfFile:filePath];
                NSString * nameStr = [NSString stringWithFormat:@"%@.wav",name];
                [formData appendPartWithFileData:data name:@"file" fileName:nameStr mimeType:@"audio/*"];
                
            }
                break;
            case DBUploadFileTypeMp3:{
                NSData *data = [NSData dataWithContentsOfFile:filePath];
                NSString * nameStr = [NSString stringWithFormat:@"%@.mp3",name];
                [formData appendPartWithFileData:data name:@"file" fileName:nameStr mimeType:@"audio/*"];
            }
                break;
                
            case DBUploadFileTypeImage:{
                NSString * nameStr = [NSString stringWithFormat:@"%@.png",name];
                [formData appendPartWithFileData:imageData name:@"file" fileName:nameStr mimeType:@"png"];
            }
                break;
          
        }
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        //上传进度
        dispatch_sync(dispatch_get_main_queue(), ^{
            progress ? progress(uploadProgress) : nil;
        });
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        success ? success(responseObject) : nil;
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure ? failure(error) : nil;
    }];
    

Solicitud creado en base Mutipart UNSURLSession

1. formato predefinido requerido por el Mutipart paquete de
línea de separación define poste datos de solicitud DBUploadBoundary
static NSString *DBUploadBoundary = @"DBUploadBoundary";
codificación personalizada macro definición
#define DBEncode(string) [string dataUsingEncoding:NSUTF8StringEncoding]
define una línea
#define DBEnter [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]

Cosiendo solicitud mutipart

-(NSData *)getDataWithPath:(NSString *)path params:(NSDictionary *)params {
    
    NSMutableData *data = [NSMutableData data];
    
    [params enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            // 拼接普通参数的上传格式.
            // 1. 普通参数上边界
            NSMutableString *headerStrM = [NSMutableString stringWithFormat:@"\r\n--%@\r\n",DBUploadBoundary];
            // 服务器接收参数的key值.
            [headerStrM appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
            
            // 将普通参数上边界添加到请求体中
            [data appendData:[headerStrM dataUsingEncoding:NSUTF8StringEncoding]];
            
            // 2. 普通参数内容
            NSString * objValue = [NSString stringWithFormat:@"%@",obj];
            NSData *parameterData = [objValue dataUsingEncoding:NSUTF8StringEncoding];
            
            // 将普通参数内容添加到请求体中
            [data appendData:parameterData];
        }];
    [data appendData:DBEnter];
    [data appendData:DBEncode(@"--")];
    [data appendData:DBEncode(DBUploadBoundary)];
    [data appendData:DBEnter];
    [data appendData:DBEncode(@"Content-Disposition: form-data; name=\"file\"; filename=\"record.wav\"")];
    
    [data appendData:DBEnter];
    
    [data appendData:DBEncode(@"Content-Type: audio/wav")];
    [data appendData:DBEnter];
    
    [data appendData:DBEnter];

    NSData *wavData = [NSData dataWithContentsOfFile:path];
    [data appendData:wavData];
    
    [data appendData:DBEnter];
        
    [data appendData:DBEncode(@"--")];
    [data appendData:DBEncode(DBUploadBoundary)];
    [data appendData:DBEncode(@"--")];
    [data appendData:DBEnter];
    
    return data;
}

3. iniciar una solicitud de red mutipart

El código de ejemplo

NSData *data = [self getDataWithPath:path params:mutableDict];
    
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    //6、获取上传的数据
    NSData *uploadData = data;
    //7、创建上传任务 上传的数据来自getData方法
    NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:uploadData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            failureBlock(error);
        }else {
            NSDictionary *contentDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];//转换数据格式
            successBlock(contentDict);
        }
        
    }];
    [task resume];

Publicado 35 artículos originales · ganado elogios 9 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/SunFlowerInRain/article/details/104793519
Recomendado
Clasificación