使用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
相关产品推荐
相关产品推荐

