Flul 数组编码

Ste*_*ell 5 c# flurl

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

这样做:

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

结果被发布:

金额=1000& allowed_source_types=card_present &capture_method=manual¤cy=usd

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

    .PostUrlEncodedAsync(
             "amount=1000&allowed_source_types[]=card_present&capture_method=manual&currency=usd"
    );
Run Code Online (Sandbox Code Playgroud)

结果被发布:

金额=1000& allowed_source_types[]=card_present &capture_method=manual¤cy=usd

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

问题:这是一个错误吗? allowed_source_types 参数是否应该包含[ ](如最初详细说明的那样)

Tod*_*ier 6

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

x[]=1,2,3
Run Code Online (Sandbox Code Playgroud)

比这样做要少得多:

x=1&x=2&x=3
Run Code Online (Sandbox Code Playgroud)

后者是Flurl 的实现方式

按照 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"
 });
Run Code Online (Sandbox Code Playgroud)