当POST请求是 既包含图片二进制 又包含字符串参数 如何用原生请求(二)

oc原生方法请求

1.oc原生请求    

    

    /*

     使用NSURLSession 进行网络请求的几个步骤

     1.构造NSURL地址

     2.构造请求对象 NSURLRequest

     3.构造NSURLSessionConfiguration配置文件,可选

     4.构造NSURLSession网络会话对象

     5.创建网络任务

     6.执行网络任务,发送网络请求

     */

    NSString *boundary = @"_YJAYgDL082HLBJkC1laRbpjU5PlLgeJh_";//放入协议头中随机生成的字符,上传文件时用来作为分隔符

    NSURL *url = [NSURL URLWithString:@"url"];

    

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

     //设置分隔符,必须写

    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField: @"Content-Type"];

    //设置POST请求

    request.HTTPMethod = @"POST";

    request.timeoutInterval = 60;

    //设置请求体

    //cinema_id=1533

    

    // post body

    NSMutableData *body = [NSMutableData data];

    NSMutableDictionary *param = [NSMutableDictionary dictionary];

    [param setObject:@"value1" forKey:@"param1"];

    

    // add params (all params are strings)

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    //pic_source文本定义的名字

    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"param1"] dataUsingEncoding:NSUTF8StringEncoding]];

    //文本内容

    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [param objectForKey:@"param1"]] dataUsingEncoding:NSUTF8StringEncoding]];

    

    NSData *imageData = data;

    if (imageData) {

        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

        //文件名字

        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", @"picture"] dataUsingEncoding:NSUTF8StringEncoding]];

        //设置文件类型

        [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

        [body appendData:imageData];

        [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

    }

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [request setHTTPBody:body];

    

    

    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];

    //文件大小

    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];

    [request setURL:url];

    NSURLSession *session = [NSURLSession sharedSession];

    

    

    

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        

        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSString *jsonString = [NSString stringWithFormat:@"%@", dic];

        NSLog(@"返回dic:%@",jsonString);

        

        //获取响应包

        //将response 转化为一个子类的HTTPURLResponse

        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

        //打印状态码

        NSLog(@"状态码:%li", httpResponse.statusCode);

        //获取响应头

        NSDictionary *responseHeader = httpResponse.allHeaderFields;

        NSLog(@"响应头:%@", responseHeader);

        

        

    }];

    

    

    //开始网络任务

    [dataTask resume];

    

2.AFN请求

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 'multipart/form-data;'

    // 修改请求序列器 为json格式

    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    // 设置请求头里Content-Type 为multipart/form-data;

    [manager.requestSerializer setValue:@"multipart/form-data;" forHTTPHeaderField:@"Content-Type"];

    // 设置响应序列器为http格式

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    // 在可接受的content-Type中添加 @"text/html"

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];

    // 发出POST请求parameters参数填写非二进制字符串参数

    [manager POST:@"url" parameters:@{@"param1":@"value1"}constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

        

      // 这里拼接 图片二进制数据这个mimeType必须有

      [formData appendPartWithFileData:UIImageJPEGRepresentation([UIImage imageNamed:@"123.jpg"], 1.0) name:@"picture" fileName:@"123.jpg" mimeType:@"image/jpeg"];

        

    } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSLog(@"111---%@",responseObject);

        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

        NSLog(@"222---%@", dic);

        

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"error == %@", error);

 }];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值