面试题答案
一键面试底层网络库选择
- Dio:
- 优势:
- 支持多种请求方式(GET、POST、PUT等),简单易用。
- 具有强大的拦截器机制,可用于添加通用请求头(如金融场景下的身份认证信息)、日志记录、错误处理等。
- 支持取消请求,在复杂网络场景下,如用户快速切换页面时,可以及时取消未完成的请求,节省资源。
- 对HTTP/2协议有良好的支持,能提高网络传输效率,在金融场景下快速传输数据很关键。
- 在iOS和Android平台的通用性:Dio在Flutter中是跨平台的网络库,在iOS和Android平台上都能无缝使用,不需要针对不同平台做特殊的底层库选择。
- 优势:
- http 库(Flutter内置):
- 优势:
- 是Flutter官方内置的HTTP客户端,与Flutter框架集成度高。
- 稳定性好,经过了大量的测试和实践。
- 缺点:相比Dio,功能相对简单,缺乏一些高级功能如拦截器等,在金融场景下需要开发者自己实现更多的功能。但如果应用对功能要求不复杂,也可以作为选择。
- 优势:
安全协议适配
- TLS(Transport Layer Security):
- 在iOS平台:
- iOS系统对TLS协议有良好的支持。在Flutter应用中,使用网络库时,确保使用最新版本的TLS协议(如TLS 1.3)。可以通过设置网络请求的安全配置来指定使用的TLS版本。例如在Dio中,可以通过配置
secureSocket
来设置TLS相关参数。 - 对于金融场景,需要验证服务器证书的有效性。可以在客户端配置证书固定(Certificate Pinning),将服务器的公钥证书或证书链固定在客户端,当与服务器建立连接时,验证服务器返回的证书是否与固定的证书匹配,防止中间人攻击。
- iOS系统对TLS协议有良好的支持。在Flutter应用中,使用网络库时,确保使用最新版本的TLS协议(如TLS 1.3)。可以通过设置网络请求的安全配置来指定使用的TLS版本。例如在Dio中,可以通过配置
- 在Android平台:
- Android同样支持TLS协议。在Flutter应用中,要保证使用的TLS版本符合安全要求。可以通过
HttpClient
的相关配置来设置TLS参数。 - 同样需要进行证书验证,在Android上也可以实现证书固定。可以使用
OkHttpClient
(Dio底层依赖OkHttpClient)的CertificatePinner
来配置证书固定策略,确保与服务器通信的安全性。
- Android同样支持TLS协议。在Flutter应用中,要保证使用的TLS版本符合安全要求。可以通过
- 在iOS平台:
- 双向认证:
- 在金融场景下:为了进一步提高安全性,可以采用双向认证(Mutual TLS,mTLS)。
- 在iOS和Android平台:在客户端和服务器端都配置证书,客户端在发起请求时,服务器验证客户端证书,客户端也验证服务器证书。在Flutter应用中,使用网络库时,需要配置客户端证书和私钥,在与服务器建立连接时发送给服务器进行验证。例如在Dio中,可以通过配置
clientCertificates
等参数来实现双向认证。
异常处理
- 网络连接异常:
- 在iOS和Android平台:
- 使用
Stream
来监听网络连接状态,例如使用connectivity_plus
库。当网络连接断开时,捕获异常并提示用户当前网络状态,同时可以在合适的时机尝试重新连接。例如在Dio的拦截器中,可以检测到网络请求失败是由于网络连接问题导致的,然后进行相应处理。 - 在网络请求代码中,使用
try - catch
块捕获网络相关异常,如SocketException
(在Flutter的dart:io
库中),这通常表示网络连接问题,如无法连接到服务器、网络超时等。对于超时异常,可以根据业务需求设置合理的超时时间,并在超时后提示用户请求超时,可选择重试。
- 使用
- 在iOS和Android平台:
- 服务器响应异常:
- 在iOS和Android平台:
- 当服务器返回非200状态码时,视为服务器响应异常。在Dio的拦截器中,可以统一处理这种情况。例如,当返回401状态码(未授权)时,提示用户重新登录;返回500状态码(服务器内部错误)时,提示用户服务器出现问题,请稍后重试。
- 解析服务器返回的错误信息,根据具体的业务错误码进行针对性处理。例如在金融场景下,服务器返回特定的业务错误码表示账户余额不足等,在客户端根据错误码友好地提示用户相关信息。
- 在iOS和Android平台:
- 安全异常:
- 在iOS和Android平台:
- 如果在TLS握手过程中出现异常,如证书验证失败等,捕获异常并提示用户可能存在安全风险。在Dio中,当证书验证失败时会抛出
HandshakeException
,可以在catch
块中处理此异常,告知用户当前连接可能不安全,是否继续操作(一般不建议继续,除非有特殊情况)。 - 对于双向认证异常,同样捕获相关异常并进行处理,确保用户知晓认证失败的情况,防止不安全的通信。
- 如果在TLS握手过程中出现异常,如证书验证失败等,捕获异常并提示用户可能存在安全风险。在Dio中,当证书验证失败时会抛出
- 在iOS和Android平台:
平台差异处理
- 网络权限:
- 在Android平台:需要在
AndroidManifest.xml
中声明网络权限,如<uses - permission android:name="android.permission.INTERNET"/>
。 - 在iOS平台:不需要在代码中显式声明网络权限,iOS系统默认应用有网络访问权限,但如果应用需要使用蜂窝网络,可能需要在
Info.plist
中配置NSAllowsCellularAccess
为YES
。
- 在Android平台:需要在
- 证书存储和管理:
- 在iOS平台:证书通常存储在系统的钥匙串(Keychain)中,在Flutter应用中使用证书固定等功能时,需要从钥匙串中获取证书相关信息。可以通过第三方插件如
flutter_keychain
来操作钥匙串。 - 在Android平台:证书管理相对复杂一些,证书可以存储在应用的特定目录下,在实现证书固定等功能时,从相应目录读取证书。同时,Android系统也有自己的证书管理机制,在某些情况下需要与系统证书管理进行交互。
- 在iOS平台:证书通常存储在系统的钥匙串(Keychain)中,在Flutter应用中使用证书固定等功能时,需要从钥匙串中获取证书相关信息。可以通过第三方插件如
- 网络代理设置:
- 在iOS平台:应用可以通过系统设置来配置网络代理,Flutter应用默认会遵循系统的代理设置。如果需要在应用内动态设置代理,可以通过
CFNetwork
框架相关的API(通过平台通道在Flutter中调用)。 - 在Android平台:可以通过
Proxy
类在应用内设置网络代理。在Flutter应用中,可以通过平台通道调用原生代码来设置代理,以适应不同的网络环境。
- 在iOS平台:应用可以通过系统设置来配置网络代理,Flutter应用默认会遵循系统的代理设置。如果需要在应用内动态设置代理,可以通过