StringContent 是否与 params(表单数据)相同?

Kon*_*ten 0 c# post dotnet-httpclient

我正在使用以下代码向服务器发布消息。

String credentials="email=me@here.com&pass=abc123";
using (HttpClient client = new HttpClient())
{
  HttpResponseMessage message = await client.PostAsync(
    url, new StringContent(credentials));
  result = await message.Content.ReadAsStringAsync();
}
Run Code Online (Sandbox Code Playgroud)

但是,服务器会回复一条错误消息,指出电子邮件或通行证不存在。

{\"状态\":\"错误\",\"消息\":\"缺少电子邮件或密码\"}

现在,我可以看到它在撒谎,但是可以做些什么呢?我是否没有提供凭据作为发布数据(相当于从 FF 中的 URL 行调用时可以看到的“参数”,如下图所示?

我还注意到,当我访问如下所示的RequestMessage 时,我得到了 URL,没有发送任何凭据。我错过了什么愚蠢的事情?!

result = message.RequestMessage.ToString();
Run Code Online (Sandbox Code Playgroud)

这个结果给了我以下字符串。

方法:POST,RequestUri:'https://server.com/gettoken',版本:1.1,内容:System.Net.Http.StringContent,标题:\u000d\u000a{\u000d\u000a 内容类型:text/plain ; 字符集=utf-8\u000d\u000a 内容长度:56\u000d\u000a}

在此处输入图片说明

voi*_*hos 5

您应该使用FormUrlEncodedContent来传递您的 POST 数据,而不是一个StringContent对象。

var credentials = new FormUrlEncodedContent(new[] {
  new KeyValuePair<string, string>("email", "me@here.com"), 
  new KeyValuePair<string, string>("pass", "abc123") 
});

using (HttpClient client = new HttpClient())
{
  HttpResponseMessage message = await client.PostAsync(
    url, credentials);
  result = await message.Content.ReadAsStringAsync();
}
Run Code Online (Sandbox Code Playgroud)