OkHttpClient请求Brreg开放API返回乱码的正确实现方式咨询
问题根因
该乱码问题由3个常见原因导致:
- 未显式指定
Accept请求头,接口默认返回了base64编码的非明文格式内容 - 未指定
Accept-Encoding请求头,接口返回的gzip压缩数据流没有被正确解码 - 未显式指定UTF-8字符集解析响应,挪威语特殊字符无法正常展示
正确实现代码
建议使用4.x及以上稳定版OkHttp,完整实现如下:
import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; import java.nio.charset.StandardCharsets; public class BrregPublicDataFetcher { public static void main(String[] args) throws IOException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://data.brreg.no/rofs/od/rofs/stottetildeling/search?language=nob&mottakerOrgnr=987&fraDato=2016-11-20") // 明确要求返回JSON明文 .header("Accept", "application/json") // 声明支持的压缩编码格式,自动适配接口返回 .header("Accept-Encoding", "gzip, deflate, br") // 指定响应字符集 .header("Accept-Charset", "UTF-8") // 增加UA标识,避免被接口反爬策略拦截 .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") .get() .build(); // 使用try-with-resources自动释放响应资源 try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("请求异常,响应码: " + response.code()); } // 显式用UTF-8解码响应字节,避免默认字符集不兼容 String responseContent = new String(response.body().bytes(), StandardCharsets.UTF_8); System.out.println(responseContent); } } }
注意事项
- 该公共接口有请求频率限制,短时间内发起大量请求会被临时封禁IP
- 响应为标准JSON结构,可直接使用Jackson、Gson等序列化工具直接解析为Java对象,无需手动处理字符串
- 若调整请求参数后仍出现乱码,可检查响应头
Content-Encoding字段,若为gzip可手动通过GZIPInputStream包装响应字节流后再读取
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

