ASP.NET微服务调用RapidAPI返回乱码而非JSON响应如何解决
排查解决步骤
这类Postman请求正常、代码调用返回乱码的问题,基本都是请求配置没对齐、压缩响应没正确处理导致的,按以下顺序排查即可:
- 优先检查自动解压缩配置
RapidAPI侧的接口默认会返回经过压缩的响应,没开自动解压的话,直接读出来的就是二进制压缩内容,看起来就是乱码。
如果你用HttpClient发请求,初始化时补上解压缩配置即可:
如果你是用var httpHandler = new HttpClientHandler { // 覆盖所有常见压缩格式,匹配接口返回的压缩类型 AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli }; var httpClient = new HttpClient(httpHandler);IHttpClientFactory注册客户端,注册阶段补上对应配置:
注意:不要手动给请求加builder.Services.AddHttpClient("RapidApiClient", client => { // 这里放你原本的基础地址、默认鉴权头配置 }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All });Accept-Encoding头,交给自动解压缩逻辑自动生成即可,手动写错值反而会导致解压失败。 - 逐字对齐Postman的请求头
不要自己凭感觉写请求头,打开Postman里正常返回的请求详情,把所有Header原封不动复制到代码里,重点核对几个字段:Accept固定设为application/json,不要留空也不要加无关的接受类型- 两个RapidAPI鉴权头
X-RapidAPI-Key、X-RapidAPI-Host不要带多余空格、不要写错值 - 不要手动给GET请求加
Content-Type头,写错反而会触发接口侧的异常处理
- 排查响应读取逻辑的编码问题
不要一开始就直接调用ReadAsStringAsync()读内容,先读原始字节判断内容格式:var response = await httpClient.GetAsync(requestUri); byte[] responseRawBytes = await response.Content.ReadAsByteArrayAsync(); // 检查是不是未解压的gzip内容:gzip格式开头固定是0x1F、0x8B两个字节 if (responseRawBytes.Length >= 2 && responseRawBytes[0] == 0x1F && responseRawBytes[1] == 0x8B) { // 走到这里说明前面的自动解压配置没生效,回去检查HttpMessageHandler的配置 } // 确认不是压缩内容后,用UTF8编码转字符串,不要随便指定GBK、GB2312这类编码 string jsonResult = Encoding.UTF8.GetString(responseRawBytes); - 排查链路中间节点的篡改问题
如果本地调试正常,部署到微服务环境后出问题,先检查服务所在环境是不是走了内网代理、自定义API网关,这类中间节点如果没有正确处理压缩响应、错误转码,就会把正常的JSON内容改成乱码,临时绕开代理直连接口测试即可定位。
快速验证方法:用Fiddler抓本地代码发出的请求,和Postman发出的请求逐行对比头、参数、路径,只要两个请求完全一致,返回结果不可能有差异。
内容的提问来源于stack exchange,提问作者Pierre Borg
相关产品推荐
相关产品推荐

