使用HttpClient调用Stack Exchange API时未返回正常JSON的问题
Stack Exchange API响应编码问题解决
浏览器访问https://api.stackexchange.com/2.3/questions?order=desc&sort=activity&site=stackoverflow能正常获取JSON,但用你提供的C#代码调用时,返回内容看似经过编码而非正常JSON,核心原因是Stack Exchange API默认返回gzip/deflate压缩后的内容——浏览器会自动解压这类响应,而你的HttpClient未开启自动解压功能,导致读取到的是压缩后的二进制转字符串内容。
解决方法很简单,在初始化HttpClient时,通过HttpClientHandler开启自动解压功能,同时支持GZip和Deflate两种压缩格式:
修改后的代码如下:
public class StackApi { private const string BaseURI = "https://api.stackexchange.com/"; private HttpClient _httpClient; public StackApi() { // 配置HttpClientHandler开启自动解压 var handler = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; _httpClient = new HttpClient(handler); _httpClient.BaseAddress = new Uri(BaseURI); _httpClient.DefaultRequestHeaders.Accept.Clear(); _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); } public async Task<string> GetQuestions() { var responseMessage = await _httpClient.GetAsync("2.3/questions?order=desc&sort=activity&site=stackoverflow"); if (responseMessage.IsSuccessStatusCode) { var responseString = await responseMessage.Content.ReadAsStringAsync(); return responseString; } return string.Empty; } }
修改后,HttpClient会自动识别响应的压缩格式并完成解压,你就能拿到正常的JSON响应内容了。
内容的提问来源于stack exchange,提问作者Linda Lawton - DaImTo
相关产品推荐
相关产品推荐

