UTF-8 URL 编码
UTF-8 URL Encode
我在使用 HttpUtility.UrlEncode()
对查询参数进行编码时遇到问题,它没有转换为 UTF-8。
query["agent"] = HttpUtility.UrlEncode("{\"mbox\":\"mailto: UserName@company.com\"}");
我尝试使用重载方法并通过 utf 编码,但仍然无法正常工作。
预期结果:
?agent=%7B%22mbox%22%3A%22mailto%3AUserName%40company.com%22%7D
实际结果:
?agent=%257b%2522mbox%2522%253a%2522mailto%253aUserName%2540company.com%2522%257d
public StatementService(HttpClient client, IConfiguration conf)
{
configuration = conf;
var BaseAddress = "https://someurl.com/statements?";
client.BaseAddress = new Uri(BaseAddress);
client.DefaultRequestHeaders.Add("Custom-Header",
"customheadervalue");
Client = client;
}
public async Task<Object> GetStatements(){
var query = HttpUtility.ParseQueryString(Client.BaseAddress.Query);
query["agent"] = HttpUtility.UrlEncode( "{\"mbox\":\"mailto:UserName@company.com\"}");
var longuri = new Uri(Client.BaseAddress + query.ToString());
var response = await Client.GetAsync(longuri);
response.EnsureSuccessStatusCode();
using var responseStream = await response.Content.ReadAsStreamAsync();
dynamic statement = JsonSerializer.DeserializeAsync<object>(responseStream);
//Convert stream reader to string
StreamReader JsonStream = new StreamReader(statement);
string JsonString = JsonStream.ReadToEnd();
//convert Json String to Object.
JObject JsonLinq = JObject.Parse(JsonString);
// Linq to Json
dynamic res = JsonLinq["statements"][0].Select(res => res).FirstOrDefault();
return await res;
}
我强烈建议您采用另一种方法,使用 Uri.EscapeDataString
方法。这个方法在 System.Net 而不是 System.Web 里面,那是一个沉重的 dll。此外 HttpUtility.UrlEncode
编码字符是大写的,这在某些情况下会成为实施 HTTP 协议时的一个问题。
Uri.EscapeDataString("{\"mbox\":\"mailto: UserName@company.com\"}")
"%7B%22mbox%22%3A%22mailto%3A%20UserName%40company.com%22%7D"
方法HttpUtility.ParseQueryString
内部returns一个HttpValueCollection
。 HttpValueCollection.ToString()
已经执行了 url 编码,因此您无需自己执行此操作。如果你自己做,它会执行两次,你会得到你看到的错误结果。
我看不出与 UTF-8 的关系。您使用的值 ({"mbox":"mailto: UserName@company.com"}) 不包含任何在 UTF-8 中看起来不同的字符。
参考文献:
我在使用 HttpUtility.UrlEncode()
对查询参数进行编码时遇到问题,它没有转换为 UTF-8。
query["agent"] = HttpUtility.UrlEncode("{\"mbox\":\"mailto: UserName@company.com\"}");
我尝试使用重载方法并通过 utf 编码,但仍然无法正常工作。
预期结果:
?agent=%7B%22mbox%22%3A%22mailto%3AUserName%40company.com%22%7D
实际结果:
?agent=%257b%2522mbox%2522%253a%2522mailto%253aUserName%2540company.com%2522%257d
public StatementService(HttpClient client, IConfiguration conf)
{
configuration = conf;
var BaseAddress = "https://someurl.com/statements?";
client.BaseAddress = new Uri(BaseAddress);
client.DefaultRequestHeaders.Add("Custom-Header",
"customheadervalue");
Client = client;
}
public async Task<Object> GetStatements(){
var query = HttpUtility.ParseQueryString(Client.BaseAddress.Query);
query["agent"] = HttpUtility.UrlEncode( "{\"mbox\":\"mailto:UserName@company.com\"}");
var longuri = new Uri(Client.BaseAddress + query.ToString());
var response = await Client.GetAsync(longuri);
response.EnsureSuccessStatusCode();
using var responseStream = await response.Content.ReadAsStreamAsync();
dynamic statement = JsonSerializer.DeserializeAsync<object>(responseStream);
//Convert stream reader to string
StreamReader JsonStream = new StreamReader(statement);
string JsonString = JsonStream.ReadToEnd();
//convert Json String to Object.
JObject JsonLinq = JObject.Parse(JsonString);
// Linq to Json
dynamic res = JsonLinq["statements"][0].Select(res => res).FirstOrDefault();
return await res;
}
我强烈建议您采用另一种方法,使用 Uri.EscapeDataString
方法。这个方法在 System.Net 而不是 System.Web 里面,那是一个沉重的 dll。此外 HttpUtility.UrlEncode
编码字符是大写的,这在某些情况下会成为实施 HTTP 协议时的一个问题。
Uri.EscapeDataString("{\"mbox\":\"mailto: UserName@company.com\"}")
"%7B%22mbox%22%3A%22mailto%3A%20UserName%40company.com%22%7D"
方法HttpUtility.ParseQueryString
内部returns一个HttpValueCollection
。 HttpValueCollection.ToString()
已经执行了 url 编码,因此您无需自己执行此操作。如果你自己做,它会执行两次,你会得到你看到的错误结果。
我看不出与 UTF-8 的关系。您使用的值 ({"mbox":"mailto: UserName@company.com"}) 不包含任何在 UTF-8 中看起来不同的字符。
参考文献: