Objective-C报”NSURLErrorBadServerResponse”异常的原因和解决办法

  • Post category:IOS

Objective-C 中报 “NSURLErrorBadServerResponse” 异常有多种原因,以下是一些常见原因及相应的解决办法:

  1. 服务器响应异常或错误。该异常通常是由于服务器返回的响应不符合预期或者格式不正确导致的。此时,我们可以通过调试服务器返回的响应,确定响应是否符合预期。

示例代码中,我们可以使用以下方式来打印服务器返回的响应:

Objective-C
NSError *error = nil;
NSURLResponse *response = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (responseData) {
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"Response: %@", responseString);
}

如果服务器返回的响应不符合预期,我们需要检查服务器的代码并修复问题。

  1. SSL 证书验证失败。如果服务器使用的是自签名证书或者证书不匹配导致 SSL 验证失败,也会报出 “NSURLErrorBadServerResponse” 异常。可以通过取消 SSL 验证跳过该异常:

“`Objective-C
// 创建一个 NSURLSession 对象
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];

// 创建一个 NSURLSessionDataTask 对象
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * data, NSURLResponse * response, NSError * error) {
// 处理响应
}];

// 取消 SSL 验证
[task resume];
“`

如果不想取消 SSL 验证,可以使用 NSURLSessionDelegate 的方法来处理 SSL 证书验证错误:

Objective-C
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
} else {
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}
}