Flurl的PostUrlEncodedAsync方法忽略JsonProperty名称

3
我正在使用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();

我的调用失败了,因为它需要“key”,但是我发送的是“KeyName”。JsonProperty/DataMember属性过去一直有效,那么为什么会在这里失败呢?
当我解决这个问题时,似乎源于这个方法调用了DefaultUrlEncodedSerializer来进行序列化。这个序列化器忽略了JsonProperty名称。
   var urlEncodedContent = new CapturedUrlEncodedContent(request.Settings.UrlEncodedSerializer.Serialize(token));
   var jsonEncodedContent = new CapturedUrlEncodedContent(request.Settings.JsonSerializer.Serialize(token));

例如,jsonEncodedContent使用JsonProperty属性,而urlEncodedContent则忽略该属性。

很确定你需要添加一个自定义序列化器。 - johnny 5
1
我看到了,但你不觉得 UrlEncoderSerializer 忽略 JsonProperty 属性有点奇怪吗? - Phillip Davis
1个回答

2
<最初的回答> JsonProperty,顾名思义,与JSON序列化相关。它实际上是Json.NET的一个特性;它能够与Flurl一起使用只是因为Flurl在其默认的JSON序列化器中使用了Json.NET。但我认为,期望名为 JsonProperty 的东西能够处理URL编码是不合理的,因为URL编码与JSON无关。
你可以通过将值投影到匿名对象来轻松解决这个问题:
url.PostUrlEncodedAsync(new { key = token.KeyName });

虽然不如JSON数据类型干净或类型安全,但我一直认为这是可以接受的,因为平均而言URL编码的数据往往比JSON有效负载更小/更平坦/更简单。

原始答案: Original Answer


1
你说得很有道理,我必须承认你给出了我问题的正确答案。但是,为了让问题更容易,并吸引更多的观众,我实际上将我的属性名 [DataMember(Name="key")] 更改为 JsonProperty。我已在 Flurl 的 Github 上添加了一条消息,看看这是否是他们预期的功能。感谢您的帮助。 - Phillip Davis
我刚刚意识到你是托德,非常感谢你提供如此棒的产品。 - Phillip Davis
是的,“他们”基本上都是我。:) 谢谢你的友好话语。随意提出与此相关的建议,这已经至少被提出过一次了,我可能会在未来的版本中考虑一些东西。 - Todd Menier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接