如何用C#获取与浏览器一致的Google Font API返回结果?
解决Google Fonts API返回内容与浏览器不一致的问题
我之前也碰到过一模一样的问题!Google Fonts API的返回结果不是只看User-Agent这么简单,它会结合请求头里的多个字段来判断应该返回什么格式的字体和语言包,你之前的问题主要出在两个地方:
问题根源
- User-Agent版本太老:你设置的Chrome 24版本还不支持WOFF2格式(Chrome从36版本才开始支持WOFF2),所以Google Fonts会默认返回兼容性更好的TrueType格式,而不是WOFF2。
- 缺少必要的请求头:WebClient默认的
Accept头和浏览器发送的不一样,API会认为你的客户端对CSS和字体格式的支持有限,从而返回简化版的规则。
解决方案
只需要调整请求头,让请求看起来更像现代Chrome浏览器的请求即可,下面是两种实现方式:
方式1:使用WebClient(.NET Framework适用)
using (WebClient client = new WebClient()) { // 设置支持WOFF2的现代Chrome User-Agent client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"); // 设置浏览器风格的Accept头,告诉API我们接受CSS格式 client.Headers.Add(HttpRequestHeader.Accept, "text/css,*/*;q=0.1"); // 可选:添加压缩支持,减少传输量(WebClient需要手动解压,若不需要可去掉) client.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); string cssContent = client.DownloadString("https://fonts.googleapis.com/css?family=Montserrat"); // 这里处理下载到的CSS内容 }
方式2:使用HttpClient(推荐,.NET Core/.NET 5+适用)
HttpClient是微软推荐的现代HTTP客户端,自动支持压缩解压,代码更简洁:
using (HttpClient client = new HttpClient()) { // 添加支持WOFF2的Chrome User-Agent client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"); // 设置Accept头 client.DefaultRequestHeaders.Accept.ParseAdd("text/css,*/*;q=0.1"); // 自动处理gzip/br压缩,无需手动操作 client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br"); string cssContent = await client.GetStringAsync("https://fonts.googleapis.com/css?family=Montserrat"); // 处理CSS内容 }
验证结果
调整后再下载,你会得到和浏览器中一致的CSS内容:包含多语言(西里尔文扩展、西里尔文、越南语、拉丁扩展、拉丁文)的@font-face规则,且全部使用WOFF2格式的字体文件。
内容的提问来源于stack exchange,提问作者Minh Nguyen
相关产品推荐
相关产品推荐

