我现在正在使用Flurl(我最喜欢的API之一)将表单数据发布到url。 我非常熟悉使用"JsonProperty"属性来命名键,并为 c# 使用标准大小写。
但是当我使用PostUrlEncodedAsync时,正常的JsonProperty代码不会转换为"key",而是保持"KeyName"并且调用失败。
public class TokenTest
{
[JsonProperty("key")]
public string KeyName { get; set; }
}
所以我有点困惑,这不能开箱即用。
var request = new TokenTest
{
KeyName = "ewr1-QuQ5jo88WfCpNPz2kTb8ES",
};
var result = await url.PostUrlEncodedAsync(request).ReceiveString();
我的调用失败,因为它想要"密钥",但我正在发送"密钥名称"。 JsonProperty/DataMember 属性在过去一直有效,那么为什么它在这里失败了呢?
当我处理这个问题时,它似乎源于此方法调用DefaultUrlEncodedSerializer
进行序列化的事实。 此序列化程序忽略 Json属性名称。
var urlEncodedContent = new CapturedUrlEncodedContent(request.Settings.UrlEncodedSerializer.Serialize(token));
var jsonEncodedContent = new CapturedUrlEncodedContent(request.Settings.JsonSerializer.Serialize(token));
例如,jsonEncodedContent 使用 JsonProperty
属性,而 urlEncodedContent 忽略该属性。
名思义,JsonProperty
与JSON序列化有关。这实际上是一个 Json.NET 功能;它与 Flurl 一起工作的事实只是 Flurl 在其默认 JSON 序列化程序中使用 Json.NET 这一事实的一个方便结果。但是我认为期望称为JsonProperty
的东西使用URL编码是不合理的,因为URL编码与JSON无关。
您可以通过投影到匿名对象上来轻松解决此问题:
url.PostUrlEncodedAsync(new { key = token.KeyName });
不那么干净或类型安全,但我一直发现这是可以接受的,因为平均而言,URL 编码的数据往往比 JSON 有效负载更小/更扁平/更简单。