我在heroku创建了一个测试应用程序(使用scaffold),我在这个heroku应用程序中构建了一个iOS客户端(使用AFNetworking 2)。我试图使用iOS应用程序从heroku中删除记录,但它无法正常工作。我从服务器收到了422状态错误。
查看heroku日志,我发现服务器正在申请CSRF令牌。所以我尝试在我的iOS客户端上使用此代码执行此操作:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer new];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", nil];
[manager DELETE:contact.url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Response: %@", [operation description]) ;
if (block) {
block(error);
}
NSLog(@"Error: %@", error);
}];
它不起作用。
如何在AFHTTPRequestOperationManager上将CSRF令牌添加到http标头?
答案 0 :(得分:5)
这里有两件事:
protect_from_forgery
来暂时禁用此功能。AFHTTPRequestOperationManager
已初始化为AFJSONResponseSerializer
,因此您无需自行设置。您可以通过X-XSRF-TOKEN
[manager.requestSerializer setValue:@"..." forHTTPHeaderField:@"..."];
(或任何标题)
醇>
答案 1 :(得分:0)
使用AFNetworking2,您可以在请求序列化程序中自定义http标头。所以你需要继承你当前使用的那个并在那里添加这个逻辑。
- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
withParameters:(NSDictionary *)parameters
error:(NSError *__autoreleasing *)error {
NSMutableDictionary *modifiedParams = [parameters mutableCopy];
modifiedParams[@"your-header-name"] = @"you-header-value";
NSMutableURLRequest *res = [super requestBySerializingRequest:request
withParameters:modifiedParams
error:error];
return res;
}