【发布时间】: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¤cy=usd
API 供应商抱怨我发布的数组无效。当我这样做时:
.PostUrlEncodedAsync(
"amount=1000&allowed_source_types[]=card_present&capture_method=manual¤cy=usd"
);
发布结果:
amount=1000&allowed_source_types[]=card_present&capture_method=manual¤cy=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 给出了“无效数组”错误。