在不同会话中登录和注销时,NSURLConnection Post 请求在应用程序启动之间失败并出现 1012 错误代码
NSURLConnection Post request failing with 1012 error code between app launch while logging in and logging out in different sessions
我在用户登录服务器后立即发送 HTTP post 请求和 NSURLConnection 同步请求。 cookie 用于身份验证,我没有将任何 cookie 设置为 header。
案例一:我第一次启动应用程序并登录时收到成功响应。
情况 2:稍后,当我退出处于登录状态的应用程序并稍后重新启动应用程序、注销并再次登录时,我收到 -1012 错误。
情况 3:在我登录的同一 session 中注销时不会发生错误。例如,如果我在应用程序启动时登录并注销,然后退出应用程序,再次重新启动并登录,我收到成功响应。
请帮我处理第二种情况。
我的post请求如下:
// perform eHTTPPost request with header
- (NSData *)doPostRequest:(NSURL *)serverURL
data:(NSData *)postData
headerContentType:(NSString *)contentType
{
NSData *returnData;
_connectionException = nil;
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long) [postData length]];
HTTPClient *client = [[HTTPClient alloc] initWithRequestType:eHTTPPOST
withServerURL:[serverURL absoluteString]
andPath:nil
andQueryString:nil
andData:postData];
[client setRequestDataContentType: contentType];
[client setRequestDataContentLength:postLength];
[client setShouldZipEncode:NO];
if([client sendRequest]){
returnData = [client responseData];
NSError *parseError = nil;
NSString *responseDataString = [NSString stringWithUTF8String:[returnData bytes]];
NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:returnData
options:NSJSONReadingAllowFragments
error:&parseError];
NSLog(@"Set attributes Response Dict: %@",responseDict);
}else{
//Handle error
_connectionException = [client responseException];
NSLog(@"HTTP error : %@", [client responseException].reason);
}
return returnData;
}
要么 cookie 即将过期,要么它们没有在启动后保留。尽管您可以尝试解决 cookie 持久性问题,但依赖 auth cookie 仍然存在并不是处理身份验证的理想方式。
相反,您的应用应将用户的凭据存储在钥匙串中,并且应在启动时登录以检索身份验证 cookie,如果登录失败或钥匙串中不存在凭据,则要求用户提供凭据.
如果你这样做,那么只要请求失败并返回 -1012 (HTTP 401),你就可以通过使用存储的凭据再次登录来简单地处理上述情况,如果失败,则要求用户提供新的凭据.
我在用户登录服务器后立即发送 HTTP post 请求和 NSURLConnection 同步请求。 cookie 用于身份验证,我没有将任何 cookie 设置为 header。
案例一:我第一次启动应用程序并登录时收到成功响应。
情况 2:稍后,当我退出处于登录状态的应用程序并稍后重新启动应用程序、注销并再次登录时,我收到 -1012 错误。
情况 3:在我登录的同一 session 中注销时不会发生错误。例如,如果我在应用程序启动时登录并注销,然后退出应用程序,再次重新启动并登录,我收到成功响应。
请帮我处理第二种情况。
我的post请求如下:
// perform eHTTPPost request with header
- (NSData *)doPostRequest:(NSURL *)serverURL
data:(NSData *)postData
headerContentType:(NSString *)contentType
{
NSData *returnData;
_connectionException = nil;
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long) [postData length]];
HTTPClient *client = [[HTTPClient alloc] initWithRequestType:eHTTPPOST
withServerURL:[serverURL absoluteString]
andPath:nil
andQueryString:nil
andData:postData];
[client setRequestDataContentType: contentType];
[client setRequestDataContentLength:postLength];
[client setShouldZipEncode:NO];
if([client sendRequest]){
returnData = [client responseData];
NSError *parseError = nil;
NSString *responseDataString = [NSString stringWithUTF8String:[returnData bytes]];
NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:returnData
options:NSJSONReadingAllowFragments
error:&parseError];
NSLog(@"Set attributes Response Dict: %@",responseDict);
}else{
//Handle error
_connectionException = [client responseException];
NSLog(@"HTTP error : %@", [client responseException].reason);
}
return returnData;
}
要么 cookie 即将过期,要么它们没有在启动后保留。尽管您可以尝试解决 cookie 持久性问题,但依赖 auth cookie 仍然存在并不是处理身份验证的理想方式。
相反,您的应用应将用户的凭据存储在钥匙串中,并且应在启动时登录以检索身份验证 cookie,如果登录失败或钥匙串中不存在凭据,则要求用户提供凭据.
如果你这样做,那么只要请求失败并返回 -1012 (HTTP 401),你就可以通过使用存储的凭据再次登录来简单地处理上述情况,如果失败,则要求用户提供新的凭据.