1. 程式人生 > >Network 【用 AFN 通過 POST 方式傳送JSON資料的兩種形式】

Network 【用 AFN 通過 POST 方式傳送JSON資料的兩種形式】

POST 傳送資料有兩種形式:

1、傳送純文字的內容
2、傳送的 body 部分帶有檔案(圖片,音訊或者其他二進位制資料)

1、使用 POST 方式傳送純文字內容:

[mgr POST:@"https://AAAAA" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
        [MBProgressHUD showSuccess:@"Send success by WZY"];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        [MBProgressHUD showError:@"Send failed by WZY"];
    }];

2、傳送的 body 部分帶有檔案(圖片,音訊或者其他二進位制資料)

// 這是一個帶有普通拼接引數和圖片引數的上傳資訊的介面 POST
+ (void)registerWithProvinceId:(int)provinceId
                   cityId:(int)cityId
                  plateNo:(NSString *)plateNo
                  brandId:(int)brandId
                    color:(NSString *)color
                    owner:(NSString *)owner
                 idCardNo:(NSString *)idCardNo
                   source:(int)source
                   images:(NSArray *)imageArr
                 callback:(BLOCK)callBack {
    
    NSString *path = @"https://www.*****";
    NSDictionary *params = @{
                             @"platform":@"IOS",
                             @"imei":IDENTIFIER_NUMBER,
                             @"manufacturer":@"apple",
                             @"version":PHONE_VERSION,
                             @"model":PHONE_TYPE,
                             @"appVersion":APP_VERSION,
                             @"provinceId":@(provinceId),
                             @"cityId":@(cityId),
                             @"plateNo":plateNo,
                             @"brandId":@(brandId),
                             @"color":color,
                             @"owner":owner,
                             @"idCardNo":idCardNo,
                             @"source":@(source)
                             };
    AFHTTPSessionManager *manager = [BPBServerReqestUtils sharedHTTPSession];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:path parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        // 使用日期生成圖片名稱(先在陣列中取UIImage物件,然後一個一個轉化為NSData型別的資料)
        for (int i = 0; i < imageArr.count; i++) {
            UIImage *image = imageArr[i];
            // 讀取圖片資料(iOS 有以下兩種讀取圖片資料的方法)
            NSData *data = UIImagePNGRepresentation(image);
            // NSData *data = UIImageJPEGRepresentation(image, 0.5);
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
            NSString *fileName = [NSString stringWithFormat:@"%@.png", [formatter stringFromDate:[NSDate date]]];
//            NSLog(@"%@",[NSString stringWithFormat:@"Image%d",i+1]);
            
            /**
             *  把圖片資料 新增到請求體裡面
             *  data 圖片data資料,分為JPEG、PNG兩種。
             *  name 後臺接收引數名(介面文件中應有標識:image1、image2、image3)
             *  fileName 上傳上去的圖片名稱,可以自行定義。填nil也是可以的。(注意這裡一定要加.jpg或者.png,具體加什麼得和上面讀取圖片資料型別保持一致)
             *  mimeType 要和上面image的格式保持一致。(可以直接寫 png,也可以寫 image/png)
             */
//            [formData appendPartWithFileData:data name:[NSString stringWithFormat:@"image%d",i+1] fileName:fileName mimeType:@"image/png"];
            [formData appendPartWithFileData:data name:[NSString stringWithFormat:@"image%d",i+1] fileName:fileName mimeType:@"png"];
        }
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        NSLog(@"進度:%@",uploadProgress);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
        callBack(dic);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        callBack(error);
    }];
}