如何使用AFIncrementalStore在每个请求中添加Auth Token?

时间:2013-06-17 18:48:12

标签: ios afnetworking afincrementalstore

我有一个iOS + Rails 3.1应用程序,我正在使用 AFIncrementalStore 进行客户端 - 服务器通信。

我已根据本教程在我的Rails服务器上实现了令牌身份验证:http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/

我现在想要在客户端到服务器的每个请求中包含&auth_token=XXXXXXXX,包括POST请求。我该怎么办?我在相关帖子中找不到解决方案:Using AFIncrementalStore with an Auth token

更新:这是我的第一次尝试代码,但似乎没有发送auth_token

(在我的 AFIncrementalStoreHTTPClient 子类中)

- (NSMutableURLRequest *)requestForFetchRequest:(NSFetchRequest *)fetchRequest withContext:(NSManagedObjectContext *)context {
    NSMutableURLRequest *request = [[super requestForFetchRequest:fetchRequest withContext:context] mutableCopy];
    NSMutableString *requestBody = [[NSMutableString alloc] initWithData:[request HTTPBody] encoding:NSUTF8StringEncoding];
    [requestBody appendFormat:@"&%@=%@", @"auth_token", @"xkT2eqqdoNp5y4vQy7xA"];
    [request setHTTPBody:[requestBody dataUsingEncoding:NSUTF8StringEncoding]];
    return request;
}

1 个答案:

答案 0 :(得分:1)

更新:我浏览了你的问题(抱歉!),我的示例代码适用于常规AFHTTPClient,但不适用于AFIncrementalStore。但是,相同的基本方法也可行,并且sample code at this answer应指向正确的方向。


在所有情况下,您不能只将&auth_token=whatever附加到HTTP正文的末尾。

您可能希望使用以下内容覆盖getPath...postPath...方法:

- (void)getPath:(NSString *)path 
     parameters:(NSDictionary *)parameters 
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    if (parameters) {
        // Make a mutable copy and add the "token" parameter to the dictionary
        NSMutableDictionary *mutableParams = [parameters mutableCopy];
        [mutableParams setObject:@"whatever" forKey:@"token"];
        parameters = [NSDictionary dictionaryWithDictionary:mutableParams];
    } else {
        parameters = @{@"token" : @"whatever"};
    }

    [super getPath:path parameters:parameters success:success failure:failure];
}

此方法将允许AFNetworking根据您的特定请求和编码设置对参数进行适当编码。

如果您要滚动自己的AFHTTPRequestOperation对象而不是使用便捷方法(可能不是),请确保在parameters 之前加入令牌你像这样创建你的NSURLRequest:

NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:parameters];