我需要与一个只接受表单编码负载的第三方端点进行交互。该端点希望在此端点使用复杂数据类型,即像这样(但是表单编码,而不是JSON):
{
"foo": "bar",
"baz": {
"zip": "zap"
}
}
通过谷歌搜索和端点文档,我发现这应该像这样进行表单编码:
foo=bar&baz[zip]=zap
我正在使用 HttpClient
,并希望使用 FormUrlEncodedContent
,但是当我这样做时,它会将我的 []
替换为转义字符。
public class Tests
{
[Fact]
public void Test()
{
var content = new Dictionary<String, String>
{
{ "foo", "bar" },
{ "baz[zip]", "zap" }
};
var formContent = new FormUrlEncodedContent(content);
Assert.Equal("foo=bar&baz[zip]=zap", formContent.ReadAsStringAsync().Result);
}
}
我最终得到的是:
foo=bar&baz%5Bzip%5D=zap
-d bar[zip]=zap
的curl示例,而Google建议虽然不是标准,但这是发送复杂对象表单编码的最常见机制(我认为jquery就是这样做的)。我同意API不应该这样做,但我仍然必须处理它。 - Micah ZoltuFormUrlEncodedContent
进行jQuery样式的复杂对象序列化”,并且最后建议更改格式,我可能会停止搜索并开始自己动手(不幸的是,这就是我不得不做的)。 - Micah Zoltu$.param()
的文档,因为它包含两个黄色警告,基本上说的是我在我的答案中说的相同的事情。 - Tomalak