我需要将视频文件从我的应用上传到服务器。我尝试通过[AFHTTPRequestOperationManager post:parameters:success:failure]
这样做,但遗憾的是不断收到请求超时。我现在尝试从the AF Docs尝试与创建上传任务类似的内容。
我看了on SO和关于setSessionDidReceiveAuthenticationChallengeBlock:
的{{3}},并尝试按照以下方式实施整个上传malarky:
__block ApiManager *myself = self;
// Construct the URL
NSString *strUrl = [NSString stringWithFormat:@"%@/%@", defaultUrl, [self getPathForEndpoint:endpoint]];
NSURL *URL = [NSURL URLWithString:strUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
[request setHTTPMethod:@"POST"];
// Build a session manager
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
// Set authentication handler
[manager setSessionDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential *__autoreleasing *credential) {
*credential = myself.credentials;
return NSURLSessionAuthChallengeUseCredential;
}];
// Create the upload task
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
[myself endpoint:endpoint returnedFailure:error];
} else {
[myself endpoint:endpoint returnedSuccess:responseObject];
}
}];
// and run with it
[uploadTask resume];
先前已设置myself.credentials
对象具有正确的用户名和密码。每当此请求触发时,我都会得到401 unauthorised
作为回复。我尝试将NSLog(@"CHALLENGE")
放在上面的挑战块中,但它似乎永远不会被调用,因此AFNetworking并没有给我一种提供凭据的方法。我知道这在服务器端运行得非常好,因为我已经用Postman测试了它。
如何让AFNetworking让我通过此上传任务提供HTTP Basic Auth的凭据?
答案 0 :(得分:0)
我不确定AFNetworking的setSessionDidReceiveAuthenticationChallengeBlock
,但只要您有NSMutableURLRequest
,就可以直接在请求对象上设置授权HTTP标头:
[request setValue:base64AuthorizationString forHTTPHeaderField:@"Authorization"];
请记住,该值必须是username:password
字符串的base64表示。
否则,对于会话管理器上的GET,POST等请求,您可以在会话管理器使用的请求序列化程序上设置凭据。参见:
[AFHTTPRequestSerializer setAuthorizationHeaderFieldWithUsername:password:]
[AFHTTPRequestSerializer clearAuthorizationHeader]