错误: HTTPS请求报错Error Code=-999 "cancelled"

本文介绍了一次线上App因公司SSL证书失效导致的所有网络请求失败事件。详细分析了问题原因,并给出了三种解决方案:更新有效证书、配置AppTransportSecuritySettings参数及调整AFN参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误

Error Domain=NSURLErrorDomain Code=-999 “cancelled” UserInfo…….

原因

今天早上刚到公司, 听到一个恶讯, 线上App所有的请求都请求错误了。公司主要的域名下的网络访问全部出问题了, 但是仅仅是iOS端没有问题, 安卓设备用户依然可以正常访问。
因为并不是用户手动进行网络请求取消操作的, 所以此原因排除。还有种可能就是HTTPS的证书问题。经过一系列查证后, 发现公司的SSL证书失效了, 导致此问题。

因为本项目使用的AFN进行网络请求的, 所以以下这个方法导致了请求被取消。

/**
 Whether or not the specified server trust should be accepted, based on the security policy.

 This method should be used when responding to an authentication challenge from a server.

 @param serverTrust The X.509 certificate trust of the server.
 @param domain The domain of serverTrust. If `nil`, the domain will not be validated.

 @return Whether or not to trust the server.
 */
- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust
                  forDomain:(nullable NSString *)domain;

证书无效后, 上面方法返回NO, 从而执行

disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;

最终导致, 当前的请求被cancel。

解决方案

1.及时将有效的证书部署于所使用的环境中。
2.通过plist文件中设置App Transport Security Settings中的参数, 比如Allow Arbitrary Loads 或者白名单。
3.对AFN中的参数设置, 允许不进行证书验证, 来规避 evaluateServerTrust: forDomain:方法的验证不通过的问题。

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];
securityPolicy.validatesDomainName = NO;
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;

最好的解决方案是及时将有效的证书部署于所使用的环境中。如果你的应用不涉及到过多的安全或者不重视此问题, 也可以在苹果没有硬性要求ATS之前通过后面的两个方法来规避。不过, 从苹果之前对ATS的要求情况来看, 也不是长久之计。

### 解决 Axios 拦截器响应时的系统异常问题 在前端开发中,使用 Axios 的拦截器来处理请求和响应是一种常见的做法。当遇到响应错误或系统异常时,可以通过配置 Axios 实例以及设置合适的拦截器逻辑来解决问题。 #### 配置 Axios 实例并实现拦截器 通过 `axios.create` 方法创建一个带有自定义配置的 Axios 实例[^1]。在此基础上,可以为该实例添加请求和响应拦截器: ```javascript // 创建 Axios 实例 const apiClient = axios.create({ baseURL: 'https://api.example.com/v1', timeout: 10000, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); // 添加请求拦截器 apiClient.interceptors.request.use( (config) => { // 在发送请求之前做些什么 console.log('Request sent:', config); return config; }, (error) => { // 处理请求错误 console.error('Error in request interceptor:', error); return Promise.reject(error); } ); // 添加响应拦截器 apiClient.interceptors.response.use( (response) => { // 对响应数据做点什么 console.log('Response received:', response.data); return response; }, (error) => { // 处理响应错误 if (!error.response) { // 如果没有收到任何响应(网络中断等情况) alert('Network Error or Timeout'); return Promise.reject(new Error('No Response from Server')); } const status = error.response.status; switch (status) { case 401: // 处理未授权的情况 window.location.href = '/login'; break; case 403: // 处理权限不足的情况 alert('Access Denied'); break; case 404: // 资源不存在 alert('Resource Not Found'); break; default: // 默认错误处理 console.error(`Unexpected HTTP Status Code ${status}`); alert('An unexpected error occurred.'); } return Promise.reject(error); } ); ``` 上述代码展示了如何捕获不同类型的错误,并根据状态码执行相应的操作。对于无法解析的错误(如超时或断开连接),也可以提供友好的用户体验提示。 #### 取消请求机制 如果需要支持取消请求的功能,则可以利用 Axios 提供的取消令牌功能。以下是具体实现方式: ```javascript function createCancelToken() { let cancelSource = axios.CancelToken.source(); function cancelRequest(message) { cancelSource.cancel(message || 'Operation canceled by the user.'); } return { token: cancelSource.token, cancelRequest }; } // 使用示例 const { token, cancelRequest } = createCancelToken(); apiClient.get('/users', { cancelToken: token }).catch((err) => { if (axios.isCancel(err)) { console.warn('Request was cancelled:', err.message); } else { console.error('There was an error fetching users:', err); } }); // 手动触发取消 cancelRequest('User navigated away before completing operation.'); ``` 此方法允许开发者主动终止正在进行的请求,从而避免不必要的资源消耗。 #### 中文编码问题与 Gradio 报错分析 某些情况下,由于字符集不匹配可能导致类似 `TypeError: str is not valid UTF-8` 这样的错误发生[^3]。尽管当前问题是针对 Axios 响应错误处理,但如果涉及跨平台部署(例如从本地迁移到服务器环境),仍需注意字符串编码的一致性。建议检查以下几点: 1. 确认前后端交互过程中使用的字符集均为标准 UTF-8; 2. 若存在动态生成的内容,请验证其是否包含非法字节序列; 3. 尝试将所有 UI 组件名称替换为纯 ASCII 字符串以排除潜在冲突。 另外,在调试阶段可启用更详细的日志记录以便定位根本原因。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值