c# - 如何使用HttpClient发送GET请求体中的内容?

标签 c# get request dotnet-httpclient

目前要向 API 接口(interface)发送参数化 GET 请求,我正在编写以下代码:

api/master/city/filter?cityid=1&citycode='ny'

但是我看到 URL 长度有 2,083 个字符的限制。

为了避免这种情况,我想在 GET 请求的内容正文中以 json 格式发送参数。

但是,我发现 HttpClient 的所有 Get 方法都不允许发送内容主体。对于 POST,我可以看到 HttpClient 中有一个名为 PostAsync 的方法,它允许内容主体。

有没有办法不在 URL 中为 GET 请求发送参数以避免 URL 长度限制?

最佳答案

请阅读此答案末尾的警告,了解为什么通常不建议带有正文的 HTTP GET 请求。


  • 如果您使用的是 .NET Core,则标准 HttpClient可以开箱即用。例如,要发送带有 JSON 正文的 GET 请求:

      HttpClient client = ...
    
      ...
    
      var request = new HttpRequestMessage
      {
          Method = HttpMethod.Get,
          RequestUri = new Uri("some url"),
          Content = new StringContent("some json", Encoding.UTF8, MediaTypeNames.Application.Json /* or "application/json" in older versions */),
      };
    
      var response = await client.SendAsync(request).ConfigureAwait(false);
      response.EnsureSuccessStatusCode();
    
      var responseBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    
  • .NET Framework 不支持这个开箱即用的功能(如果您尝试上面的代码,您将收到一个 ProtocolViolationException)。值得庆幸的是,微软提供了 System.Net.Http.WinHttpHandler 确实支持该功能的软件包 - 只需安装并使用它而不是默认的 HttpClientHandler在构造您的 HttpClient 实例时:

      var handler = new WinHttpHandler();
      var client = new HttpClient(handler);
    
      <rest of code as above>
    

    引用:https://github.com/dotnet/runtime/issues/25485#issuecomment-467261945


注意事项:

  • 带有正文的 HTTP GET 是一种有点非常规的构造,属于 HTTP 规范的灰色区域 - 最终结果是许多较旧的软件根本无法处理此类请求,或者会明确拒绝它,因为它们认为它是畸形的。您需要非常确保您尝试向其发送此类请求的端点确实支持它,否则充其量您将收到一个 HTTP 错误代码;在最坏的情况下, body 会被默默地丢弃。这可能会导致一些令人头疼的调试!
  • 缓存代理服务器,尤其是较旧的代理服务器,可能仅基于 URL 缓存 GET 请求,因为它们不希望出现正文。这可能会导致最近的请求被永久缓存(这会破坏您的软件),或者曾经缓存的唯一请求是最近发出的请求(这将阻止缓存按预期工作)。同样,弄清楚这一点可能会非常痛苦。

关于c# - 如何使用HttpClient发送GET请求体中的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421126/

相关文章:

iphone - 如何在 iOS 中发送 Get 请求?

c# - 从 asp :textbox with JQuery 中检索值

c# - 检查网络连接

c# - 正则表达式来测试逗号的正确使用

java.net.MalformedURLException : no protocol:/intl/en/policies/GET Request

java - 如何使用 Visual Basic 向需要字符串的服务器发出 POST 请求?

c# - 错误 cs0246 "The type or namespace name ' Player' 无法找到(您是否缺少 using 指令或程序集引用?)”

javascript - Vue 和 Axios CORS 错误 No 'Access-Control-Allow-Origin' header is present on the requested resource

java - 如何使用可分页参数定义请求方向?

node.js - npm 请求集主体