如何解决解析来自REST请求的响应时出现错误编码
上下文:我使用Selenium来解析http://bizhub.vn/tech/start-up-cvn-loyalty-receives-vnd11-billion-investment_318377.html上的内容,然后获取新闻内容,然后使用来自意义云.com(文本摘要服务)的API来汇总4个句子。
我正在使用.NET 5.0.100-preview.8.20417.9,ASP.NET Core Web API 5
文件indvNumber
SysUtil.cs
using System;
namespace bizhubdotvn_tech.Controllers
{
public class SysUtil
{
public static String StringEncodingConvert(String strText,String strSrcEncoding,String strDestEncoding)
{
System.Text.Encoding srcEnc = System.Text.Encoding.GetEncoding(strSrcEncoding);
System.Text.Encoding destEnc = System.Text.Encoding.GetEncoding(strDestEncoding);
byte[] bData = srcEnc.GetBytes(strText);
byte[] bResult = System.Text.Encoding.Convert(srcEnc,destEnc,bData);
return destEnc.GetString(bResult);
}
}
}
public static string SummaryText(string newsContent)
{
var client = new RestClient("https://api.meaningcloud.com/summarization-1.0");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddParameter("key","25870359b682ec3c93f9becd850eb442");
request.AddParameter("txt",JsonEncodedText.Encode(newsContent));
request.AddParameter("sentences",4);
IRestResponse response = client.Execute(request);
var mm = JObject.Parse(response.Content);
string raw_string = (string)mm["summary"];
//FIXME: sinh ra các ký tự lạ.
string foo2 = SysUtil.StringEncodingConvert(raw_string,"Windows-1251","UTF-8");
Console.WriteLine("summary4 = " + foo2);
return foo2;
}
=
response.Content
"{\"status\":{\"code\":\"0\",\"msg\":\"OK\",\"credits\":\"1\",\"remaining_credits\":\"19756\"},\"summary\":\"NextPay Joint Stock Company on Monday announced it had invested VND11 billion (US$473,000) in CNV Loyalty.Established at the end of 2017,CNV Loyalty creates customer care applications for businesses.Nguyen Tuan Phu,founder cum CEO of CNV Loyalty said: \\\\u201CWith only the cost of VND50 - 150 million,significantly lower than building a customer care system in a traditional way,Loyalty designs a customised application for the business with its own brand to interact directly with customers. In particular,the rate of accessing customers accurately up to 95 per cent.\\\\u201DThe start-up has received an investment of VND11 billion from NextPay and Next100 - investment fund from Nguyen Hoa Binh after two months of an appraisal.Nguyen Huu Tuat,CEO of NextPay said: \\\\u201CWe are living in a digital economy whose main form is the app economy. [...] CNV Loyalty is a solution to help brands always present directly,interact directly,understand their customers directly at a zero cost. [...] The investment of NextPay will help CNV Loyalty to invest more deeply in technology and products.With the market heavily influenced by COVID-19,Vietnamese start-ups still developing and receiving investment from domestic investors without being dependent on venture capital abroad is a great encouragement to Viet Nam\\\\u0027s start-up community.\"}"
=
foo2
如何解决"NextPay Joint Stock Company on Monday announced it had invested VND11 billion (US$473,founder cum CEO of CNV Loyalty said: \\u201CWith only the cost of VND50 - 150 million,the rate of accessing customers accurately up to 95 per cent.\\u201DThe start-up has received an investment of VND11 billion from NextPay and Next100 - investment fund from Nguyen Hoa Binh after two months of an appraisal.Nguyen Huu Tuat,CEO of NextPay said: \\u201CWe are living in a digital economy whose main form is the app economy. [...] CNV Loyalty is a solution to help brands always present directly,Vietnamese start-ups still developing and receiving investment from domestic investors without being dependent on venture capital abroad is a great encouragement to Viet Nam\\u0027s start-up community."
上的问题(在全球范围内,考虑这种类型的字符,而不仅仅是一个特定的字符)?
解决方法
因此,这可能是您对返回的对象执行的后期处理。您无需执行任何操作。这也可能是您使用的RestClient
。没有理由使用RestClient
。您可以使用HttpClient
来完成HTTP协议所需的一切。
我去签名并尝试了一个密钥,它就可以正常工作而不必“重新编码”数据。这是我的实现:
private static readonly HttpClient _httpClient = new HttpClient();
private sealed class MeaningResponseModel
{
[JsonProperty("summary")]
public string Summary { get; set; }
}
private static async Task<MeaningResponseModel> GetMeaningfulDataAsync(
string key,int sentences,Uri uri)
{
var queryString = $"key={key}&sentences={sentences}" +
$"&url={WebUtility.UrlEncode(uri.ToString())}";
using (var req = new HttpRequestMessage(HttpMethod.Post,new UriBuilder("https://api.meaningcloud.com/summarization-1.0")
{
Query = queryString
}.Uri))
{
using (var res = await _httpClient.SendAsync(req))
{
res.EnsureSuccessStatusCode();
using(var s = await res.Content.ReadAsStreamAsync())
using(var sr = new StreamReader(s))
using(var jtr = new JsonTextReader(sr))
{
return new JsonSerializer().Deserialize<MeaningResponseModel>(jtr);
}
}
}
}
private async Task TestThis()
{
var test = await GetMeaningfulDataAsync(
"YOUR KEY HERE",20,new Uri("http://bizhub.vn/tech/start-up-cvn-loyalty-receives-vnd11-billion-investment_318377.html"));
Console.WriteLine(test.Summary);
}
输出:
,private static readonly HttpClient _httpClient = new HttpClient();
private sealed class MeaningResponseModel
{
[JsonProperty("summary")]
public string Summary { get; set; }
}
private static async Task<MeaningResponseModel> GetMeaningfulDataAsync(string key,string content)
{
var queryString = $"key={key}&sentences={sentences}&txt={content}";
using (var req = new HttpRequestMessage(HttpMethod.Post,new UriBuilder("https://api.meaningcloud.com/summarization-1.0") { Query = queryString }.Uri))
{
using (var res = await _httpClient.SendAsync(req))
{
res.EnsureSuccessStatusCode();
using (var s = await res.Content.ReadAsStreamAsync())
using (var sr = new StreamReader(s))
using (var jtr = new JsonTextReader(sr))
{
return new Newtonsoft.Json.JsonSerializer().Deserialize<MeaningResponseModel>(jtr);
}
}
}
}
使用时:
// Lấy summary 4 câu.
var temp = await GetMeaningfulDataAsync("25870359b682ec3c93f9becd850eb442",4,contentAfterTrim);
string summary4 = temp.Summary;
summary4 = summary4.Replace("[...] ","");
news.Summary4 = summary4;
Console.WriteLine("summary4 = " + summary4);
,
我相信您想替换特殊字符,例如
\ u201c
尼克·范·埃施(Nick van Esch)在this thread中发布了与之大致相同的答案,这可能会对您有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。