Аналогично этой проблеме.
Используя AFNetworking 2.0.3 и пытаясь загрузить изображение с помощью POST AFHTTPSessionManager + ConstructionBodyWithBlock. По неизвестным причинам кажется, что тело сообщения HTTP всегда пусто, когда запрос отправляется на сервер.
Ниже я создаю подкласс AFHTTPSessionManager (отсюда и использование [self POST ...]
.
Я пробовал построить запрос двумя способами.
Метод 1: я просто попытался передать параметры, а затем добавить только данные изображения, если они существуют.
- (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 на github.
AFHTTPRequestOperationManager
, и он работал нормально, но когда я использовал почти идентичныйAFHTTPSessionManager
, он терпел неудачу. Похоже, внутриAFHTTPSessionManager
что-то не так. - person Rob   schedule 06.01.2014task.response
? Мой возвращаетstatusCode
из 406 (но тот же запрос подходит дляAFHTTPRequestOperationManager
). - person Rob   schedule 07.01.2014401 Unauthorized
, так какaccess_token
не отправлялся вместе с запросом. ошибка 406 звучит странно. Очевидно, ваш сервер беспокоится о том, что его ответ на клиент не обрабатывается. Вы устанавливаете какие-либо специальные заголовки HTTP в запросе? - person Mike Sukmanowsky   schedule 07.01.2014AFHTTPRequestSerializer
иAFHTTPResponseSerializer
соответственно. И тот же запрос (и использование сериализаторов) отлично работал сAFHTTPRequestOperationManager
. Я отлаживаю два класса менеджера AFNetworking, чтобы увидеть, в чем причина несоответствия между ними. - person Rob   schedule 07.01.2014NSURLSession
и использование AFNetworkingsetHTTPBodyStream
(а неsetHTTPBody
) приводит к искаженным запросам. Смотрите мой ответ ниже. - person Rob   schedule 10.01.2014