c# - Flurl 的 PostUrlEncodedAsync 忽略 JsonProperty 名称
问题描述
我正在使用 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
来进行序列化的事实。此序列化程序忽略 JsonProperty 名称。
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 有效负载更小/更扁平/更简单。
推荐阅读
- scala - Akka:以编程方式添加自定义序列化程序
- c++ - 从 base64 C++ 解码和保存图像文件
- java - 如何在 android studio 中修复“IllegalStateException”(致命异常)?
- javascript - 有时代码未显示在 Visual Studio 代码的自动完成列表中,解决方案?
- amazon-web-services - 避免存储在 s3 存储桶上的 http 内容在浏览器中被破坏
- c# - 拼写检查 en-GB 不适用于日文键盘
- python - 无法使用 python 脚本切换 gcloud 平台帐户
- java - 如何使用apache poi将excel中的滚动条限制为最大行大小?
- asp.net - 如何设计一个带有空白第一行的数据源的gridview或表格,我们可以在asp.net中搜索表格列?
- bash - 通过校验和查找目录中修改过的文件