2013-08-05 3 views
1

У меня есть класс веб-сервиса (MyAPIClient), который расширяет AFHTTPClient. Все запросы на веб-сервер отправляются с использованием метода postPath, а данные находятся в формате JSON. MyAPIClient содержит только один метод:AFHTTPClient и gzip

- (id)initWithBaseURL:(NSURL *)url 
{ 
    self = [super initWithBaseURL:url]; 
    if (!self) { 
     return nil; 
    } 
    [self setDefaultHeader:@"Accept" value:@"application/json"]; 
    [self setParameterEncoding:AFJSONParameterEncoding]; 
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

    return self; 
} 

Теперь я хочу добавить кодировку gzip. Как FAQ говорит:

Просто возьмите HTTPBody из NSMutableURLRequest, сжимать данные и повторно установить его перед созданием операции с использованием запроса.

У меня есть библиотека Godzippa, поэтому я могу сжимать данные. Далее я думаю, что нужно переопределить метод PostPath, что-то вроде этого:

-(void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure 
{ 
    NSMutableURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:parameters]; 
    NSData *newData = [[request HTTPBody] dataByGZipCompressingWithError:nil];  
    [request setHTTPBody:newData]; 

    [self setDefaultHeader:@"Content-Type" value:@"application/gzip"]; 

    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; 
    [self enqueueHTTPRequestOperation:operation]; 

} 

Я считаю, что это не правильный способ сделать это как AFHTTPClient необходимо преобразовать NSDictionary в JSON и только тогда я могу кодировать в Gzip и установите правильный «Content-Type», верно? Любая помощь будет оценена по достоинству.

ответ

1

Если кто-то имеет такую ​​же проблему, вот мое решение (Godzippa не работает для меня, поэтому я использовал другую библиотеку для кодирования данных):

- (id)initWithBaseURL:(NSURL *)url 
{ 
    self = [super initWithBaseURL:url]; 
    if (!self) { 
     return nil; 
    } 
    [self setDefaultHeader:@"Content-Type" value:@"application/json"]; 
    [self setDefaultHeader:@"Content-Encoding" value:@"gzip"]; 
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

    return self; 
} 

-(void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure 
{ 
    NSData *newData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:NULL]; 
    newData = [newData gzipDeflate]; 

    NSMutableURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:nil];  
    [request setHTTPBody:newData]; 

    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; 
    [self enqueueHTTPRequestOperation:operation]; 
} 
Смежные вопросы