Ios AF3.0-错误的授权代码
我使用AFHTTPSessionManager获取带有授权头的请求 如果用户/密码错误,根据postman,服务器返回的内容类型为:text/html,带有:Ios AF3.0-错误的授权代码,ios,objective-c,http-response-codes,afnetworking-3,Ios,Objective C,Http Response Codes,Afnetworking 3,我使用AFHTTPSessionManager获取带有授权头的请求 如果用户/密码错误,根据postman,服务器返回的内容类型为:text/html,带有: <!DOCTYPE html> <html> <head> <title>Apache Tomcat/8.0.21 - Error report</title> <style type="text/css">H1 {font-f
<!DOCTYPE html>
<html>
<head>
<title>Apache Tomcat/8.0.21 - Error report</title>
<style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style>
</head>
<body>
<h1>HTTP Status 401 - Błąd podczas autentykacji</h1>
<div class="line"></div>
<p>
<b>type</b> Status report
</p>
<p>
<b>message</b>
<u>Błąd podczas autentykacji</u>
</p>
<p>
<b>description</b>
<u>This request requires HTTP authentication.</u>
</p>
<hr class="line">
<h3>Apache Tomcat/8.0.21</h3>
</body>
</html>
返回状态代码,500
以及N错误
NSString* errorResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];
NSLog(@"Error response: %@", errorResponse);
返回错误响应:{“Error”:{“code”:“UNKNOWN_Error”,“details”:null,“description”:“Server Error”,“version”:0}
这是我的get操作方法
- (void)getOperationForAction:(NSString *)action
parameters:(NSArray *)params
completion:(id (^)(id json, BOOL success))completion {
NSURL *url = [self apiUrlForAction:action params:params.mutableCopy];
AFHTTPSessionManager *manager = [self sessionManager];
[manager GET: url.absoluteString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"JSON: %@", responseObject);
if (completion) {
completion(responseObject, YES);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSString *responseString = [[NSString alloc] initWithData:(NSData *)error.userInfo[NSLocalizedRecoverySuggestionErrorKey] encoding:NSUTF8StringEncoding];
if(responseString != nil && ![responseString isEqualToString: @""]) {
NSData *JSONData = [responseString dataUsingEncoding: NSUTF8StringEncoding];
id responseJSON = [NSJSONSerialization JSONObjectWithData:JSONData options: NSJSONReadingMutableContainers error:nil];
if(responseJSON != nil) {
}
}
NSHTTPURLResponse *test = (NSHTTPURLResponse *)task.response;
NSLog (@"Status code, %i", test.statusCode);
NSString* errorResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];
NSLog(@"Error response: %@", errorResponse);
ApiError *apiError = [[ApiError alloc] initWithString:errorResponse error:nil];
completion(apiError, NO);
}];
}
请求处理正确-401问题是在我故意使用错误的身份验证登录名/密码检查响应错误时出现的。问题在于前面提到的状态代码不正确
@编辑
为了
状态代码,500
错误代码,-1011
Error domain,com.alamofire.Error.serialization.response使用Postman进行测试时返回的状态码是什么?如果是500,那么它和你在AFNetworking中看到的一样,这意味着你的AFNetworking使用没有问题。服务器返回的是一个500的情况下,你更喜欢401。除非你能控制服务器,否则你只需要处理它(例如,解析500响应的主体以查找嵌入的401状态)。就像你们在上面看到的身体一样。使用旧版本的AFNetworking和AFHTTPRequestOperation获得状态代码401。500表示“内部服务器错误”。服务器可能希望呈现401错误,但在生成错误时遇到错误。检查服务器日志。此外,为了调试类似的东西,我建议您学习使用Wireshark或其他网络捕获软件来分析实际通过网络发送的内容:如果您在Wireshark中检查HTTP响应,您可能会在响应数据包中看到错误代码500(AFNetworking在解析响应代码时不太可能出现严重错误,特别是因为它正在包装Cocoa类)。我知道每个状态码的意思。我将使用AFNetworking 3.0从我的ApiClass使用纯邮递员和URLResponse/NSError向您展示从请求返回的所有数据。因此,您在生成错误时对wiresharks和error的评论是无用的。服务器给了我正确的401回复(通过邮递员检查),但我担心网络以错误的方式处理此错误。AFNetworking的重点-错误处理可能的问题,而不是服务器端。服务器端也可以通过android/WP应用程序进行检查-它返回401。不,实际上,你们并没有提到邮递员正在返回401。答案的主体,你确实粘贴到了你的问题中,碰巧提到了401。这并不意味着实际的HTTP状态代码也是401。既然你说邮递员确实返回了401,并且第一次提到你从AFNetworking 2.x获得了401,也许你应该向我们展示你编写的代码的AFNetworking 3.x版本。当与邮递员一起测试时,返回的状态代码是什么?如果是500,那么它和你在AFNetworking中看到的一样,这意味着你的AFNetworking使用没有问题。服务器返回的是一个500的情况下,你更喜欢401。除非你能控制服务器,否则你只需要处理它(例如,解析500响应的主体以查找嵌入的401状态)。就像你们在上面看到的身体一样。使用旧版本的AFNetworking和AFHTTPRequestOperation获得状态代码401。500表示“内部服务器错误”。服务器可能希望呈现401错误,但在生成错误时遇到错误。检查服务器日志。此外,为了调试类似的东西,我建议您学习使用Wireshark或其他网络捕获软件来分析实际通过网络发送的内容:如果您在Wireshark中检查HTTP响应,您可能会在响应数据包中看到错误代码500(AFNetworking在解析响应代码时不太可能出现严重错误,特别是因为它正在包装Cocoa类)。我知道每个状态码的意思。我将使用AFNetworking 3.0从我的ApiClass使用纯邮递员和URLResponse/NSError向您展示从请求返回的所有数据。因此,您在生成错误时对wiresharks和error的评论是无用的。服务器给了我正确的401回复(通过邮递员检查),但我担心网络以错误的方式处理此错误。AFNetworking的重点-错误处理可能的问题,而不是服务器端。服务器端也可以通过android/WP应用程序进行检查-它返回401。不,实际上,你们并没有提到邮递员正在返回401。答案的主体,你确实粘贴到了你的问题中,碰巧提到了401。这并不意味着实际的HTTP状态代码也是401。既然你说邮递员确实返回了401,并且第一次提到你从AFNetworking 2.x获得了401,也许你应该向我们展示你编写的代码的AFNetworking 3.x版本。
- (void)getOperationForAction:(NSString *)action
parameters:(NSArray *)params
completion:(id (^)(id json, BOOL success))completion {
NSURL *url = [self apiUrlForAction:action params:params.mutableCopy];
AFHTTPSessionManager *manager = [self sessionManager];
[manager GET: url.absoluteString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"JSON: %@", responseObject);
if (completion) {
completion(responseObject, YES);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSString *responseString = [[NSString alloc] initWithData:(NSData *)error.userInfo[NSLocalizedRecoverySuggestionErrorKey] encoding:NSUTF8StringEncoding];
if(responseString != nil && ![responseString isEqualToString: @""]) {
NSData *JSONData = [responseString dataUsingEncoding: NSUTF8StringEncoding];
id responseJSON = [NSJSONSerialization JSONObjectWithData:JSONData options: NSJSONReadingMutableContainers error:nil];
if(responseJSON != nil) {
}
}
NSHTTPURLResponse *test = (NSHTTPURLResponse *)task.response;
NSLog (@"Status code, %i", test.statusCode);
NSString* errorResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];
NSLog(@"Error response: %@", errorResponse);
ApiError *apiError = [[ApiError alloc] initWithString:errorResponse error:nil];
completion(apiError, NO);
}];
}
NSHTTPURLResponse *test = (NSHTTPURLResponse *)task.response;
NSLog (@"Status code, %i", test.statusCode);
NSLog (@"Error code, %i", error.code);
NSLog (@"Error domain, %@", error.domain);