Как this issue.AFNetworking 2.0 multipart request body blank
Использование AFNetworking 2.0.3 и попытка загрузить изображение с помощью POST + конструкции AFHTTPSessionManagerBodyWithBlock. По неизвестным причинам кажется, что тело сообщения HTTP всегда пустое, когда запрос отправляется на сервер.
I подкласс AFHTTPSessionManager ниже (отсюда и использование [self POST ...]
Я попытался построения данной просьбе два способа
Метод 1:.. Я просто попытался пройти Params, а затем добавить только изображение данные должны существовать это
- (void) createNewAccount:(NSString *)nickname accountType:(NSInteger)accountType primaryPhoto:(UIImage *)primaryPhoto
{
NSString *accessToken = self.accessToken;
// Ensure none of the params are nil, otherwise it'll mess up our dictionary
if (!nickname) nickname = @"";
if (!accessToken) accessToken = @"";
NSDictionary *params = @{@"nickname": nickname,
@"type": [[NSNumber alloc] initWithInteger:accountType],
@"access_token": accessToken};
NSLog(@"Creating new account %@", params);
[self POST:@"accounts" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
if (primaryPhoto) {
[formData appendPartWithFileData:UIImageJPEGRepresentation(primaryPhoto, 1.0)
name:@"primary_photo"
fileName:@"image.jpg"
mimeType:@"image/jpeg"];
}
} success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"Created new account successfully");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error: couldn't create new account: %@", error);
}];
}
Метод 2:. пытались построить данные формы в самом блоке:
- (void) createNewAccount:(NSString *)nickname accountType:(NSInteger)accountType primaryPhoto:(UIImage *)primaryPhoto
{
// Ensure none of the params are nil, otherwise it'll mess up our dictionary
if (!nickname) nickname = @"";
NSLog(@"Creating new account %@", params);
[self POST:@"accounts" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFormData:[nickname dataUsingEncoding:NSUTF8StringEncoding] name:@"nickname"];
[formData appendPartWithFormData:[NSData dataWithBytes:&accountType length:sizeof(accountType)] name:@"type"];
if (self.accessToken)
[formData appendPartWithFormData:[self.accessToken dataUsingEncoding:NSUTF8StringEncoding] name:@"access_token"];
if (primaryPhoto) {
[formData appendPartWithFileData:UIImageJPEGRepresentation(primaryPhoto, 1.0)
name:@"primary_photo"
fileName:@"image.jpg"
mimeType:@"image/jpeg"];
}
} success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"Created new account successfully");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error: couldn't create new account: %@", error);
}];
}
Использование любого из методов, когда HTTP-запрос попадает на сервер, нет данных POST или параметров строки запроса, а только заголовков HTTP.
Transfer-Encoding: Chunked
Content-Length:
User-Agent: MyApp/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)
Connection: keep-alive
Host: 127.0.0.1:5000
Accept: */*
Accept-Language: en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5
Content-Type: multipart/form-data; boundary=Boundary+0xAbCdEfGbOuNdArY
Accept-Encoding: gzip, deflate
Любые мысли? Также размещена ошибка в AFNetworking's github repo.
Я создал множественный запрос с 'AFHTTPRequestOperationManager', и он работал нормально, но когда я использовал почти идентичный' AFHTTPSessionManager', он терпит неудачу. Похоже, внутри 'AFHTTPSManManager' что-то не так. – Rob
Это сделало трюк @Rob, оставив вопрос открытым, но это определенно пахнет ошибкой. –
Вы пробовали смотреть на 'task.response'? Mine возвращает «statusCode» из 406 (но тот же запрос отлично от 'AFHTTPRequestOperationManager'). – Rob