HttpClient的PostAsync无效的POST格式

8

我将尝试使用HttpClient的PostAsync方法来登录网站,但是它总是失败。当我使用WireShark跟踪连接时,发现它错误地提交了数据。

代码

var content = new FormUrlEncodedContent(new[] 
{
    new KeyValuePair<string, string>("value1", data1),
    new KeyValuePair<string, string>("value2", data2),
    new KeyValuePair<string, string>("value3", data3)
});

或者

var content = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("value1", data1), 
    new KeyValuePair<string, string>("value2", data2), 
    new KeyValuePair<string, string>("value3", data3)
};

使用方法

httpClient.PostAsync(postUri, content)

期望

value1=123456&value2=123456&value3=123456

现实

//It adds strange += which makes the post fail...
value1=123456&value2+=123456&value3+=123456

4
参数名在 URL 编码后是否可能会留有空格,导致出现 + 符号? - Jason P
@Jason P 我会重新检查 - Erric J Manderin
3个回答

4
我知道这个有效:
var values = new List<KeyValuePair<string, string>>();

values.Add(new KeyValuePair<string, string>("Item1", "Value1"));
values.Add(new KeyValuePair<string, string>("Item2", "Value2"));
values.Add(new KeyValuePair<string, string>("Item3", "Value3"));

using (var content = new FormUrlEncodedContent(values))
{
    client.PostAsync(postUri, content).Result)
}

但我没有看到这个和我发布的代码有什么不同,但我会尝试一下。 - Erric J Manderin
我同意,没有区别,这就是重点,我知道这段代码是有效的。你应该在值中寻找差异 :) - Liel
错误是我自己的问题,而不是httpClient的问题:D正如Jason P所说,我的参数名称中有空格。无论如何,非常感谢您的帮助。 - Erric J Manderin

1

修剪参数中可能存在的空格。空格会导致+号出现

var content = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("value1", data1.Trim()), 
    new KeyValuePair<string, string>("value2", data2.Trim()), 
    new KeyValuePair<string, string>("value3", data3.Trim())
};

0

在我看来,这样更加美观:

var variables = new Dictionary<string, string>() {
    { "value1", value1 },
    { "value2", value2 }
};
var content = new FormUrlEncodedContent(variables);

如果你需要重复的键,那么在加载时使用字典可以很有用,因为它可以检查重复的值...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接