【问题标题】:Is the StringContent the same as params (form data)?StringContent 是否与 params(表单数据)相同?
【发布时间】:2014-11-12 23:19:57
【问题描述】:

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

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();
}

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

{\"status\":\"error\",\"message\":\"电子邮件或密码丢失\"}

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

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

result = message.RequestMessage.ToString();

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

方法:POST,RequestUri:'https://server.com/gettoken',版本:1.1,内容:System.Net.Http.StringContent,标头:\u000d\u000a{\u000d\u000a 内容类型:文本/纯文本; charset=utf-8\u000d\u000a 内容长度:56\u000d\u000a}

【问题讨论】:

  • POST 请求的默认格式(例如来自实际的 HTML 表单)是application/x-www-form-urlencoded,其中键与值用等号 (=) 分隔。
  • @voithos 好眼睛,伙计!我更正了文字。这是等号 - 我只是在编辑我的真实凭据时写错了。另外,我添加了一个关于 RequestMessage 的新行。现在有什么想法吗?
  • 您应该尝试使用FormUrlEncodedContent 而不是StringContent。看到这个答案:stackoverflow.com/a/20005964/716118
  • @voithos (a) 将此作为回复发布,因为它非常有效!惊人的! (b) 我仍然看不到 RequestMessage 中的参数......虽然我得到了正确的令牌和东西,但仍然......
  • 这可能是由于 HttpRequestMessageToString() 实现。尝试检查message.Content.ToString()

标签: c# post dotnet-httpclient


【解决方案1】:

您应该使用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();
}

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 2012-05-13
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多