开发环境:Net core ,
Nuget包: RestSharp
问题:获取的网站编码格式是GBK,所以返回的数据乱码(RestSharp虽然开源并且很方便,但关于请求编码处理的有点坑)
解决方法:RestClient不仅会返回body界面同时会返回一个byte[]类型的数组,这个数组是GBK编码形成的,通过HttpUtility.UrlDecode(response.RawBytes, Encoding.GetEncoding("gbk"))把数组转换成正常的GBK的值就可以了(Netcore 无法识别GBK编码格式,方法在下面)
网站是Get请求 代码如下:
/// <summary> /// Get 获取数据 /// </summary> /// <param name="Url">网址</param> /// <returns></returns> public static object GetHelperAsync(string Url) { var client = new RestClient(Url); var request = new RestRequest(Method.GET); //我请求的网站请求头需要一些参数 request.AddHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3"); IRestResponse response = client.Execute(request); return response.Content; }
接收到的网页乱码,然后通过查看网页源代码发现编码方式为(charset=GBK)
因为大部分网页乱码都是由于请求标头和所访问的界面格式不一致引起的。
1.引入支持GBK编码的包 System.Text.Encoding.CodePages
Netcore不识别GBK编码格式,所以Encoding.GetEncoding("GBK")会报错,引入上述的nuget包,然后在使用Encoding方法之前 注册该包内的编码
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
这样就不会报错了。最后代码:
/// <summary> /// Get 获取数据 /// </summary> /// <param name="Url">网址</param> /// <returns></returns> public static object GetHelperAsync(string Url) { var client = new RestClient(Url); var request = new RestRequest(Method.GET); //我请求的网站请求头需要一些参数 request.AddHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3"); IRestResponse response = client.Execute(request); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var data=HttpUtility.UrlDecode(response.RawBytes, Encoding.GetEncoding("gbk")); return data; }
RestSharp会把原来网站以byte[]数组的形式存放在RawBytes中,我们对这个数组解码就可以获取到正常的数据了