【问题标题】:Http post works in Postman but not in C# with HttpClientHttp post 在 Postman 中有效,但在带有 HttpClient 的 C# 中无效
【发布时间】:2025-12-15 21:10:01
【问题描述】:

如果我通过 Postman 发布了 Http (Https) 帖子,一切正常。但是,如果我在 .NET 核心中使用 HttpClient 尝试相同的帖子,它将无法正常工作,似乎授权失败或类似的事情,因为 response.StatusCode 没问题,但如果我阅读内容字符串,我会得到一个带有 404 的 HTML 页面它问我是否想登录。

当然,我已经检查了地址等明显的东西,并尝试了不同的令牌(它们总是在邮递员中工作)。我还尝试了添加 Bearer 令牌的不同版本:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

这是目前的代码:

client.BaseAddress = new Uri("www.baseaddress.de");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var content = new StringContent(JsonConvert.SerializeObject(new { id = object.Id }), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"/address", content);

邮递员标题:

身体:

我也尝试过失眠,它在那里也很有效。也许邮递员在其标题中做了一些我不知道的事情? postman 和 HttpClient 之间的共同区别是什么?有没有人对我可以做什么或尝试找出错误有任何其他建议?

编辑:

通过在基地址后面添加/ 并在调用前面删除它来修复它:

client.BaseAddress = new Uri("www.baseaddress.de/");
HttpResponseMessage response = await client.PostAsync($"address", content);

也许有人知道为什么基地址末尾需要/,为什么我不能把它放在API调用之前?

【问题讨论】:

  • 证书有效吗?
  • 是的。我刚刚又检查了一遍。
  • 使用 Postman 的代码生成器查看原始 HTTP 请求并将其与您在 c# 中所做的比较。检查您的 BaseAddress 是否以斜杠 / 结尾
  • 我现在感觉很愚蠢,但是在将/ 添加到基地址并在地址之前删除/ 之后它可以工作。 ...为什么我必须在我的基地址后添加斜杠,而不能在“/address”之类的.PostAsync 方法中使用它?请添加您的评论作为答案,我会接受。非常感谢。
  • 我找到了这种问题的原因,通过fiddler捕获并比较了postman请求与HttpClient请求。也许这可以给你一个线索。

标签: c# asp.net-core http-post postman dotnet-httpclient


【解决方案1】:

你需要做的不是new { id = object.Id }.ToString()

JsonConvert.SerializeObject(new { id = object.Id })

new { id = 77 }.ToString() 这样的代码产生"{ id = 77 }",而不是"{ id: "77" }"

【讨论】:

  • 得到相同的响应。 :(
  • @Genfood 不会“修复”您当前的问题,但在.SerializeObject 之后您不需要.ToString()。它已经返回了你需要的 json 字符串。
  • @Genfood 现在看起来像是地址问题。您能否仔细检查您的请求是否具有正确的最终 URL。也许您需要传递 '"/address"',而不仅仅是 address 作为参数。另外,尝试在 .PostAsync 方法中使用整个 URL:http://address:port/address
  • 我在基地址之后添加了斜杠,现在一切正常,就像@Crowcoder 说的那样。在我的真实代码中,在地址刚刚审查 URL 之前有一个 /。
  • 谢谢@Genfood,我花了很多时间旋转*,直到我看到你的评论。
【解决方案2】:

我遇到了同样的问题,我把地址从http改成了https

【讨论】:

    最近更新 更多