【发布时间】:2020-05-15 09:59:06
【问题描述】:
可能重复的问题,但我找不到我的问题的答案。我有这个代码来调用网络服务:
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://172.21.122.1:5001/autocomplete");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
//tried this too: httpWebRequest.Accept = "gzip, deflate";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write("{ \"message\" : \"mü\" }");
streamWriter.Flush();
streamWriter.Close();
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
response = "";
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
response = streamReader.ReadToEnd();
}
但无论我用 StreamReader() c'tor 尝试什么编码,我都会得到这个响应或更糟:{"words":["m\u00fc\u015fteri","m\u00fc\u015fterisiyim""]}
当我使用 Postman 或 SoapUI 以相同的请求调用相同的服务时:{"message": "mü"}, 响应看起来不错:{"words": ["müşteri","müşterisiyim"]}
奇怪的是:相同的代码适用于许多其他服务。只有这个特定的服务才没有正确编码响应。我们认为该服务存在编程错误,但我想知道 Postman 或 SoapUI 是如何处理这个问题的。他们的代码中应该有一个控件,如果响应包含“\uxxxx”,那么 Postman 或 SoapUI 会再次对其进行解码。
我检查了 Postman 和 SoapUI 中的所有请求/响应标头,但没有运气。可能是什么原因?
【问题讨论】:
-
我注意到你实际上并没有在看 Postman 中的 Body ...? Postman 屏幕截图仅显示标题,但 C# 正在尝试读取正文
-
您的响应正文看起来也很合理:它以
{"words": ["开头,这是有效的 JSON,很可能意味着字符编码很好,没有压缩等。字符串本身也可能没问题:如果你用它们所代表的实际字符替换\uxxxx,你会得到müşeri和müşterisiyim,谷歌翻译告诉我这是有效的土耳其语 -
请求对象长什么样子?如果您从外部某处加载“单词”内容,则可能存在编码问题。
-
我已经编辑了问题并添加了我在代码和 Postman 中使用的请求/响应。
-
Regex.Unescape(response)甚至response = Regex.Unescape( streamReader.ReadToEnd());会解决问题吗?
标签: unicode character-encoding postman soapui fallback