You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Maui Android应用无法访问本地API的问题求助

解决.NET Maui Android模拟器中RestSharp连接本地API失败的问题

关键问题分析

  • Android模拟器默认拦截ICMP协议包,所以Ping.Send("google.com")超时是正常现象,与HTTP请求能力无关,无需关注。
  • 浏览器能访问API但RestSharp调用失败,问题大概率出在代码的异步处理、RestSharp配置或请求参数上。

解决步骤

1. 替换RestSharp同步调用为异步调用

你的方法标记为async Task<bool>,但使用了同步的client.Execute,这在Android环境下可能导致线程死锁或网络请求阻塞,改为异步的ExecuteAsync:

// 替换同步调用
// RestResponse response = client.Execute(request, Method.Post);
// 改为异步调用
RestResponse response = await client.ExecuteAsync(request);

2. 处理HTTPS自签名证书问题(如果使用HTTPS)

本地API的自签名证书默认不被Android模拟器信任,可在RestClient中临时忽略证书验证(仅用于测试环境):

var client = new RestClient(baseURL);
// 添加证书验证回调,测试环境下跳过验证
client.RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

3. 确认基础URL格式

确保Constants.MobileAPIURI完整,包含http://或https://前缀,例如:

// 正确格式
public const string MobileAPIURI = "http://10.0.2.2:5000";
// 错误格式(缺少协议前缀)
// public const string MobileAPIURI = "10.0.2.2:5000";

4. 检查API绑定地址

确保本地API绑定到0.0.0.0(所有可用IP),而不是仅127.0.0.1,否则模拟器的10.0.2.2无法访问到API。

5. 排查请求参数匹配

如果API期望POST参数放在请求体而非URL查询参数中,改用AddParameter或AddJsonBody:

// 表单格式参数
request.AddParameter("username", username, ParameterType.RequestBody);
request.AddParameter("password", password, ParameterType.RequestBody);

// 或JSON格式参数
request.AddJsonBody(new { username, password });

6. 获取详细错误信息

通过response.ErrorException查看具体错误原因,帮助定位问题:

if (response.ErrorException != null)
{
    // 打印或记录错误详情
    Console.WriteLine($"请求错误: {response.ErrorException.Message}");
}

修改后的完整代码示例

public static async Task<bool> Authenticate(string username, string password)
{
    string baseURL = Constants.MobileAPIURI;
    var client = new RestClient(baseURL);
    
    // 测试环境下忽略HTTPS证书验证
    client.RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

    var request = new RestRequest("login", Method.Post);
    // 根据API要求选择参数传递方式,这里以Query参数为例
    request.AddQueryParameter("username", username);
    request.AddQueryParameter("password", password);

    RestResponse response = await client.ExecuteAsync(request);

    // 打印错误信息用于排查
    if (response.ErrorException != null)
    {
        Console.WriteLine($"请求失败: {response.ErrorException.Message}");
    }

    if (response.StatusCode == System.Net.HttpStatusCode.OK)
    {
        var token = System.Text.Json.JsonSerializer.Deserialize<string>(response.Content);

        if (!string.IsNullOrEmpty(token))
        {
            await SecureStorage.SetAsync(Constants.AUTHTOKENVALUE, token);
            return true;
        }
    }

    return false;
}

内容的提问来源于stack exchange,提问作者MyselfAndOnlyMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:50:10