NSDictionary *params = @{@"userId": @123, @"token": @"abc"};
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
[mgr POST:urlString parameters:params success:^(AFHTTPRequestOperation *op, id response) {
NSLog(@"成功:%@", response);
} failure:^(AFHTTPRequestOperation *op, NSError *error) {
NSLog(@"失敗:%@", error);
}];
// 假設 fileData: NSData, fileName: NSString, mimeType: NSString
[mgr POST:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:fileData name:@"avatar" fileName:fileName mimeType:mimeType];
} success:^(AFHTTPRequestOperation *op, id response) {
// 成功回調
} failure:^(AFHTTPRequestOperation *op, NSError *error) {
// 失敗回調
}];
parameters 同時傳遞普通字段(如 userId、token)。constructingBodyWithBlock 回調中追加文件數據,AFN 自動構建 multipart 請求體。name 需與服務端接收參數名一致(如 PHP $_FILES['avatar'])。AFHTTPRequestSerializer 自定義。AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:data name:name fileName:fileName mimeType:mimeType];
} progress:nil success:^(NSURLSessionDataTask *task, id response) {
} failure:^(NSURLSessionDataTask *task, NSError *error) {
}];
核心思路:**字段走 parameters,文件走 constructingBodyWithBlock**,AFN 封裝了繁瑣的邊界構建、Content-Type 設置。