【问题标题】:Flurl Array EncodingFlurl 数组编码
【发布时间】:2019-02-04 14:07:50
【问题描述】:

我正在尝试将一些包含字符串数组的数据发布到端点,但收到错误“无效数组”

这样做:

   .PostUrlEncodedAsync(new
     {
        amount = 1000,
        allowed_source_types = new[] { "card_present" },
        capture_method = "manual",
        currency = "usd"
     });

发布结果:

amount=1000&allowed_source_types=card_present&capture_method=manual&currency=usd

API 供应商抱怨我发布的数组无效。当我这样做时:

    .PostUrlEncodedAsync(
             "amount=1000&allowed_source_types[]=card_present&capture_method=manual&currency=usd"
    );

发布结果:

amount=1000&allowed_source_types[]=card_present&capture_method=manual&currency=usd

API 供应商很高兴,我得到了预期的结果。

问题:这是一个错误吗? allowed_source_types 参数是否应该包含 [ ] 最初详述的here?

【问题讨论】:

  • 用 URL 的说法,使用 allowed_source_types[]=card_present 将名为 allowed_source_types[] 的参数的值设置为单个值 card_present -- 这与设置名为 allowed_source_types 的参数不同。 API 当然可以使用带有[] 的参数名称(如果在发送到服务器时正确编码),但这不是标准的。 Flurl 在没有被要求的情况下添加 [] 是不正确的。当然,棘手的一点是您不能在 C# 中指定名称中带有 [] 的属性,因此需要一种替代机制。
  • 检查 API 是否接受传递多值参数的“标准”方式 (a=val1&a=val2&a=val3) 或者是否也使用其他方式 (a[]=val1,val2,val3) 也是值得的。后者也不是通用库不被要求就应该做的事情。 (话虽如此,标准实际上并没有说明多值参数,但第一种方式是浏览器自古以来就使用的方式,因此是“标准”。API 可能有不同的想法。)跨度>
  • @JeroenMostert 您的 cmets 中的所有内容都完全正确,您所描述的最“标准”正是 Flurl 所做的,所以我邀请您将其放入答案中。 PostUrlEncodedAsync 对字典进行特殊处理,这是我能想到的添加 [] 的最佳方式。
  • @ToddMenier:我没有任何使用 Flurl 的经验,所以可能会有更好的答案。具体来说,以 Flurl 接受的方式调用此 API 的“正确”方式会很好(当然,发布您自己制作的文字查询字符串总是可能的,但这是最不吸引人的方式)。
  • @JeroenMostert - 感谢您提供详细信息。肯定学到了一些东西。曾尝试传递等效的 a=val1&a=val2&a=val3,但 API 给出了“无效数组”错误。

标签: c# flurl


【解决方案1】:

这不是错误。正如 cmets 中所提到的,没有对集合进行 URL 编码的标准,但可以这样做:

x[]=1,2,3

比这样的做法少得多:

x=1&x=2&x=3

后者是how Flurl has implemented it。

按照 API 要求的方式执行此操作的问题是 [] 在 C# 标识符中无效,因此典型的对象表示法不起作用。但是 Flurl 对 Dictionary 对象进行了特殊处理,所以最好的办法是这样做:

.PostUrlEncodedAsync(new Dictionary<string, object>
{
    ["amount"] = 1000,
    ["allowed_source_types[]"] = "card_present", // or string.Join(",", allowedSourceTypes)
    ["capture_method"] = "manual",
    ["currency"] = "usd"
 });

【讨论】:

  • 感谢您提供详细信息。通过字典按预期工作。感谢您给我们 Flurl。您让 C# 世界变得更美好!
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 2023-03-12
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多