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

使用HttpClient发送带Header与Body的POST请求遇406错误求助

解决API调用返回406 Not Acceptable的问题

首先,406错误的核心原因是:服务器无法返回你的请求中Accept头指定的媒体类型内容。结合你的代码,我们来一步步排查和修复:

1. 先修正最明显的URL问题

你写的"www.theUrlToTheApi"不是完整的HTTP URL,HttpClient必须使用带协议(http/https)的完整地址,比如:

var response = await client.PostAsync("https://www.theUrlToTheApi", content);

缺少协议会导致请求发送失败,这可能是触发406的间接原因之一。

2. 检查Accept头与服务器的兼容性

你添加了Accept: application/json,但有些服务器可能对这个头的格式有更严格的要求,比如需要指定字符集,或者服务器实际不支持返回JSON(虽然你用了JSON请求体,但服务器可能返回其他格式)。

可以尝试两种调整方式:

  • 方式一:移除自定义Accept头,让HttpClient自动使用默认的协商头,或者服务器会根据请求体的Content-Type自动匹配返回类型:
    // 注释掉这行
    // client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
  • 方式二:更明确地指定Accept头,比如包含字符集:
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json") { CharSet = "utf-8" });
    

3. 修复类型不匹配的严重错误

你的代码里存在明显的类型不匹配问题:

// 声明的是LoremIpsum1类型
LoremIpsum1 data = null;
// 但反序列化用了QueueInfo类型
data = JsonConvert.DeserializeObject<QueueInfo>(json);

这会导致运行时反序列化失败(甚至编译错误),必须改成和声明一致的类型:

data = JsonConvert.DeserializeObject<LoremIpsum1>(json);

4. 清理无效代码

return data.data;之后的Debug.WriteLine(data.data);永远不会执行,直接删掉即可。

修正后的完整代码

public async Task<List<LoremIpsum>> LoremIpsumJson() {
    LoremIpsum1 data = null;
    try {
        using var client = new HttpClient(); // 使用using自动释放HttpClient,避免资源泄漏
        
        // 添加授权和方法头
        client.DefaultRequestHeaders.Add("Method", "LoremIpsumExample");
        client.DefaultRequestHeaders.Add("Token", "sometoken");
        
        // 构造请求体
        var requestBody = new {
            Name = "John",
            Surname = "Doe",
            Example = "SomeNumber"
        };
        // 用序列化代替手动写JSON字符串,避免语法错误
        HttpContent content = new StringContent(
            JsonConvert.SerializeObject(requestBody), 
            Encoding.UTF8, 
            "application/json"
        );
        
        // 可选:调整Accept头,或者直接注释掉
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json") { CharSet = "utf-8" });
        
        // 使用完整URL
        var response = await client.PostAsync("https://www.theUrlToTheApi", content);
        response.EnsureSuccessStatusCode();
        
        string json = await response.Content.ReadAsStringAsync();
        data = JsonConvert.DeserializeObject<LoremIpsum1>(json);
        
        Debug.WriteLine(data.data); // 把Debug放在return之前
    } catch(Exception ex) {
        Debug.WriteLine($"请求出错:{ex.Message}");
        // 可以在这里处理错误,比如返回空列表或者抛出异常
        return new List<LoremIpsum>();
    }
    
    return data?.data ?? new List<LoremIpsum>(); // 空值保护,避免NullReferenceException
}

额外提示:

  • 用using包裹HttpClient,避免资源泄漏;
  • 用匿名类序列化生成JSON请求体,比手动写字符串更不容易出错;
  • 添加空值保护(data?.data ?? ...),避免data为null时抛出空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:20:17