我使用ktor CIO引擎进行API调用。当我尝试检查网络调用但 URL 未显示在 Android studio 网络检查中时。性能测试团队尝试使用 Fiddler 工具拦截 API 调用,但也无法捕获 API 调用。
我必须更改应用程序内的任何设置吗?
我已将 cleartextTrafficPermission 添加为 true,以用于系统和用户的测试。
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
我尝试在 AndroidManifest 文件中添加cleartextTrafficPermissed 也用于测试。但似乎没有任何作用。我在这里错过了什么吗?
Ktor 实现如下:
@Provides
@Singleton
fun provideHttpClient(): HttpClient = HttpClient(CIO) {
expectSuccess = false
install(ContentNegotiation) {
gson()
}
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.ALL
}
install(HttpTimeout) {
requestTimeoutMillis = 120000
connectTimeoutMillis = 120000
socketTimeoutMillis = 120000
}
engine {
https {
trustManager = @SuppressLint("CustomX509TrustManager")
object : X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
override fun checkClientTrusted(p0: Array<out X509Certificate>?, p1: String?) {
}
@SuppressLint("TrustAllX509TrustManager")
override fun checkServerTrusted(p0: Array<out X509Certificate>?, p1: String?) {
}
override fun getAcceptedIssuers(): Array<X509Certificate>? = null
}
}
}
HttpResponseValidator {
validateResponse { response: HttpResponse ->
val statusCode = response.status.value
println("HTTP status: $statusCode")
when (statusCode) {
in 300..399 -> throw RedirectResponseException(response, statusCode.toString())
in 400..499 -> throw ClientRequestException(response, statusCode.toString())
in 500..599 -> throw ServerResponseException(response, statusCode.toString())
}
if (statusCode >= 600) {
throw ResponseException(response, statusCode.toString())
}
}
handleResponseExceptionWithRequest { cause, request ->
println("HTTP status: $cause")
throw cause
}
}
}
您似乎正在使用 Ktor 与 CIO 引擎在 Android 应用程序中进行 API 调用,但您在 Android Studio 网络检查和 Fiddler 工具中捕获网络调用时遇到问题。以下是一些可帮助您排除故障并解决问题的建议:
检查互联网权限: 确保您的 AndroidManifest.xml 文件包含互联网访问所需的权限。添加以下行(如果不存在):
xml
<uses-permission android:name="android.permission.INTERNET" />
网络安全配置: 如果您已在清单中将cleartextTrafficPermission 设置为 true,则它应该允许 HTTP 流量。但是,请确保您已正确定义网络安全配置。在 res/xml/ 目录中创建一个 network_security_config.xml 文件,其中包含以下内容:
xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
在清单中引用此文件:
xml
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
验证Fiddler配置: 如果您的性能测试团队尝试使用 Fiddler 拦截 API 调用,请确保 Fiddler 已正确配置。确保 Fiddler 正在运行并配置为捕获流量。仔细检查设备或模拟器是否配置为使用 Fiddler 代理。
验证 Android Studio 配置: 确保 Android Studio 已正确配置用于网络检查。确保您使用的设备或模拟器具有正确的代理设置,并且 Android Studio 设置为捕获网络流量。
登录Ktor: 您的 Ktor HttpClient 配置为启用日志记录。检查 Android Studio Logcat 输出中是否有与 HTTP 请求相关的任何日志。这可以帮助您识别请求的任何问题。
检查 SSL 问题: 由于您使用的是自定义信任管理器,因此请确保正确处理 SSL 证书。如果存在与 SSL 相关的问题,它们可能会阻止捕获网络流量。
通过仔细检查和调整这些配置,您应该能够在 Android Studio 网络检查和 Fiddler 中捕获网络调用。如果问题仍然存在,您还可以考虑查看其他潜在因素,例如代理设置、防火墙或其他网络相关配置。