返回

MAUI Android 应用无法调用 Web API?试试这几招!

Android

MAUI Android 应用无法调用 Web API? 试试这几招!

你正在兴致勃勃地开发一款跨平台的 MAUI 应用,幻想着它能流畅运行在 Android 和 iOS 上。然而,现实却给你泼了一盆冷水:在 Android 平台上调用 Web API 时,程序崩溃,还抛出一个令人头疼的异常:“Object reference not set to an instance of an object.”。

先别慌,你不是一个人!很多开发者在使用 MAUI 开发 Android 应用时都遇到过类似问题。本文将带你抽丝剥茧,分析问题根源,并提供解决方案,助你顺利解决 MAUI Android 应用与 Web API 的交互问题。

追根溯源:问题出在哪里?

在深入解决方案之前,我们需要先了解问题可能出现的环节。根据你的和代码片段,我们可以从以下几个方面入手排查:

  1. Android 网络安全策略 : Android 系统对应用的网络安全有着严格的限制。从 Android 9(API 级别 28)开始,系统默认禁止应用使用明文 HTTP 连接。如果你使用的 Web API 基于 http 协议,而你的 MAUI Android 应用没有进行相应的配置,就会导致无法连接到服务器。

  2. IP 地址配置 : 你提到将 10.1.0.10 配置为允许明文通信的 IP 地址,但这个地址指向的是 IIS 服务器,而你的 Web API 可能需要访问位于 10.1.0.11 的 SQL Server 数据库。如果网络安全配置中缺少 SQL Server 的 IP 地址,同样会导致 Web API 调用失败。

  3. 代码逻辑错误 : 即使网络配置正确,你的代码逻辑也可能存在问题。例如,你在客户端获取数据的代码中使用了 fich 类,但却没有提供该类的定义,我们无法确定它是否与 Web API 返回的数据结构一致。此外,如果在访问 Cds1.CdNom 之前没有判断 Cds1 是否为 null,也可能导致 “Object reference not set to an instance of an object” 异常。

对症下药:解决方案全解析

找到了问题根源,接下来我们就来逐一解决。

1. 启用 HTTP 明文通信 (不推荐)

最简单的解决方法是在 AndroidManifest.xml 文件中添加 android:usesCleartextTraffic="true" 属性。

<application
    ...
    android:usesCleartextTraffic="true">
    ...
</application>

这个方法虽然简单粗暴,但会降低应用的安全性,不建议在生产环境中使用。

2. 配置网络安全配置文件

为了兼顾便利性和安全性,推荐使用配置网络安全配置文件的方式,允许应用与特定域名或 IP 地址使用 HTTP 明文通信。

你需要完成以下两步:

  1. 修改 network_security_config.xml 文件 : 将 Web API 和 SQL Server 的 IP 地址都添加到允许列表中。
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">10.1.0.10</domain> 
    <domain includeSubdomains="true">10.1.0.11</domain>
  </domain-config>
</network-security-config>
  1. AndroidManifest.xml 文件中引用配置文件 :
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
    ...
</application>

3. 检查代码逻辑

网络配置完成后,还需要仔细检查代码逻辑,确保客户端代码能够正确处理 Web API 返回的数据。

  1. 确认 fich 类定义 : 你需要提供 fich 类的完整定义,确保其属性名称和数据类型与 Web API 返回的数据结构完全一致。

  2. 处理 null 值 : 在访问 Cds1.CdNom 之前,需要先判断 Cds1 是否为 null,避免出现 “Object reference not set to an instance of an object” 错误。

if (response.IsSuccessStatusCode)
{
    Cds1 = await response.Content.ReadAsAsync<fich>();
    
    if (Cds1 != null) 
    {
        Console.WriteLine(Cds1.CdNom);
    }
    else
    {
        Console.WriteLine("获取数据失败:Cds1 为 null");
    }
}

总结

通过以上步骤,相信你已经解决了 MAUI Android 应用无法调用 Web API 的问题。

最后,再次强调一下安全性的重要性。为了提高应用的安全性,建议你将 Web API 迁移到 HTTPS 协议,从根源上解决明文传输带来的安全隐患。

常见问题解答

  1. 问:为什么我的 MAUI Android 应用在模拟器上可以正常调用 Web API,但在真机上却不行?

    答: 这可能是因为你的模拟器和真机的网络环境不同。模拟器通常使用的是开发机器的网络,而真机使用的是移动网络或 Wi-Fi 网络。建议你检查真机的网络连接,并确保 Web API 服务器对真机开放访问权限。

  2. 问:除了配置网络安全配置文件,还有其他方法可以解决 HTTP 明文通信的问题吗?

    答: 是的,你可以将 Web API 迁移到 HTTPS 协议,或者使用 VPN 将 HTTP 流量强制转换为 HTTPS 流量。

  3. 问:为什么我按照文章的步骤操作了,但还是无法解决问题?

    答: 这可能是因为你的问题比较特殊,文章中没有涵盖到。你可以尝试搜索 MAUI 官方文档或社区论坛,寻求更详细的帮助。

  4. 问:如何调试 MAUI Android 应用与 Web API 之间的通信问题?

    答: 你可以使用 Visual Studio 的调试功能,在代码中设置断点,并查看变量的值和网络请求的详细信息。此外,你也可以使用网络抓包工具(如 Fiddler 或 Charles)来捕获和分析网络请求。

  5. 问:除了本文提到的问题,还有哪些因素可能会导致 MAUI Android 应用无法调用 Web API?

    答: 其他可能的原因包括:Web API 服务器故障、网络连接中断、客户端代码逻辑错误等。