1

AFHTTPClient を拡張する Web サービス クラス (MyAPIClient) があります。Web サーバーへのすべてのリクエストは postPath メソッドを使用して送信され、データは JSON 形式です。MyAPIClient にはメソッドが 1 つだけ含まれています。

- (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が言うように:

NSMutableURLRequest から HTTPBody を取得し、データを圧縮し、リクエストを使用して操作を作成する前に再設定するだけです。

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」を設定できるので、これは正しい方法ではないと思います。どんな助けでも大歓迎です。

4

1 に答える 1

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];
}
于 2013-08-06T14:10:25.277 に答える