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

使用C#调用Airtable POST API返回422错误,请求排查原因

Airtable API 提交记录返回422错误的排查与修复

问题原因分析

返回422错误意味着请求格式不符合Airtable API的要求,你的代码存在三个关键问题:

  • 请求JSON结构不匹配:Airtable创建记录要求请求体必须是包含records数组的结构,每个数组元素包含fields对象存放字段值。但你的代码直接序列化Product2类,生成的JSON是{"ItemName":"xxx","Image":"xxx"},不符合API规范。
  • 缺少正确的Content-Type头:StringContent默认使用text/plain作为Content-Type,而Airtable API要求请求体的Content-Type为application/json,否则服务器无法正确解析JSON数据。
  • HttpClient BaseAddress设置冗余:你既设置了client.BaseAddress为完整URI,又在PostAsync中传入完整URI,会导致请求地址被重复拼接,最终请求地址无效。

修复后的代码

public async Task InsertRecord(Product2 item)
{
    var uri = "https://api.airtable.com/v0/appxxx/MainItem";
    var apiKey = "keyxxxx";
    
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Clear();
        client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
        
        try
        {
            // 构造符合Airtable API要求的请求体结构
            var requestBody = new
            {
                records = new[]
                {
                    new
                    {
                        fields = new
                        {
                            ItemName = item.ItemName,
                            Image = item.Image
                        }
                    }
                }
            };
            
            string json = JsonConvert.SerializeObject(requestBody);
            // 指定请求内容类型为application/json
            StringContent content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
            
            HttpResponseMessage response = await client.PostAsync(uri, content);
            
            if (response.IsSuccessStatusCode)
            {
                Debug.WriteLine("Successfully saved.");
            }
            else
            {
                // 打印错误响应内容,便于后续排查
                var errorContent = await response.Content.ReadAsStringAsync();
                Debug.WriteLine($"Error: {response.StatusCode}, Details: {errorContent}");
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"ERROR: {ex.Message}");
        }
    }
}

// 原Product2类无需修改
public class Product2
{
    public string ItemName { get; set; }
    public string Image { get; set; }
}

修复说明

  1. 调整请求体结构:用匿名对象构造records数组,每个元素包含fields对象,完全匹配Airtable API的格式要求。
  2. 指定Content-Type:创建StringContent时明确传入application/json,确保服务器正确解析请求数据。
  3. 移除冗余BaseAddress:直接使用完整URI调用PostAsync,避免地址拼接错误。
  4. 增加错误日志:打印错误响应的具体内容,方便后续遇到问题时快速定位原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:43:11