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

Xamarin.Forms中Flurl请求API返回Null,Postmaster请求正常求助

嘿,我来帮你捋捋这个问题~你说用Postman能正常拿到数据,但Flurl调用就返回Null,而且确认授权是没问题的(改令牌会报401),那大概率是响应解析或者请求配置的细节没跟上,我给你几个排查方向和解决办法:

1. 先搞清楚API返回的实际内容

你先用调试代码把原始响应打出来,看看Flurl到底拿到了什么——别直接用GetJsonListAsync(),先获取原始字符串:

try
{
    var response = await "https://cloud.squidex.io/api/content/straktest/experiment?"
        .WithOAuthBearerToken("你的令牌")
        .GetAsync();
    // 先确保请求没出错(虽然授权正常,但万一有其他HTTP状态码呢)
    response.EnsureSuccessStatusCode();
    var rawContent = await response.Content.ReadAsStringAsync();
    Debug.WriteLine("原始响应内容:" + rawContent);
}
catch (Exception ex)
{
    Debug.WriteLine("请求异常:" + ex.ToString());
}

如果rawContent是空的,那可能是API在特定请求头下返回空,但Postman有额外头;如果rawContent是有内容的JSON,那就是解析的问题。

2. 检查JSON结构是否匹配你用的解析方法

Postman里看一下API返回的是纯数组还是包含数组的对象:

  • 如果返回的是[{...}, {...}]这种纯数组,那用GetJsonListAsync<YourModel>()没问题;
  • 如果返回的是类似{"total":5, "items": [{...}]}这种外层带包装的对象,直接用GetJsonListAsync()就会因为结构不匹配返回Null——这时候你得先定义对应模型:
// 外层响应模型
public class ApiResponse<T>
{
    public int Total { get; set; }
    public List<T> Items { get; set; }
}

// 你的数据模型,字段要和API返回的一致,注意大小写!
public class Experiment
{
    // 比如API返回的是camelCase的"id",这里如果是PascalCase的Id,要加JsonProperty属性
    [JsonProperty("id")]
    public string Id { get; set; }
    // 其他字段照着API返回的加...
}

然后调用的时候换成:

var apiResponse = await "你的URL"
    .WithOAuthBearerToken("令牌")
    .GetJsonAsync<ApiResponse<Experiment>>();
var yourList = apiResponse.Items;

3. 配置Flurl的JSON序列化规则

Xamarin里默认的序列化器可能和API的格式不兼容(比如API用camelCase,而你的模型是PascalCase),你可以把Flurl改成用Newtonsoft.Json,并配置驼峰命名解析:
在App.xaml.cs的初始化代码里加:

using Flurl.Http.Configuration;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

// ...

FlurlHttp.Configure(settings =>
{
    settings.JsonSerializer = new NewtonsoftJsonSerializer(new JsonSerializerSettings
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver(),
        NullValueHandling = NullValueHandling.Ignore
    });
});

这样就能自动匹配API的camelCase字段了。

4. 对齐Postman的请求头

有时候Postman里会自动加一些请求头(比如特定的Accept版本),Flurl的默认头可能不匹配。你把Postman里的Headers全部复制过来,在Flurl里加上:

var list = await "你的URL"
    .WithOAuthBearerToken("令牌")
    .WithHeader("Accept", "application/json;v=1") // 换成Postman里的Accept值
    .WithHeader("User-Agent", "PostmanRuntime/7.29.0") // 可选,也可以用Flurl默认的
    // 其他Postman里的头都加上
    .GetStringAsync();

最后再检查下Android的权限

确保你的AndroidManifest.xml里加了网络权限:

<uses-permission android:name="android.permission.INTERNET" />

虽然模拟器一般默认有,但万一漏掉了也会导致请求异常。

按这些步骤排查下来,应该能找到问题所在~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:18:14