【问题标题】:How can I send a GET request with json body?如何发送带有 json body 的 GET 请求?
【发布时间】:2020-04-03 02:37:14
【问题描述】:

有什么方法可以使用 c# 发送带有 JSON 正文的 GET 请求吗?我正在调用 API 以使用 GET 请求检索项目列表,但我必须以 JSON 格式传递 customer_id。我能够在 Postman 和 Python 中成功地做到这一点。但是,我正在使用的旧版应用程序是作为 c# .NET winform 构建的。我可以使用 HttpClient 进行其他调用,但经过一些研究,我发现这个类不允许使用主体的 GET 请求,除非使用 CORE。还有其他选择吗?

【问题讨论】:

  • 您能告诉我们为什么您想这样做吗?使用 GET 请求传递正文是不常见的。
  • @mjwills 我正在使用的 api 请求 customer_id 通过正文以 json 格式发送。
  • 你试过在查询字符串中传递它吗?为什么API是这样的?这很不寻常。
  • 检查 API 是否也支持 POST 动词在同一个调用。我使用的唯一支持 GET 的 API 是 ElasticSearch,它们还提供了一个选项来运行相同的方法POST.

标签: c# api get request httpclient


【解决方案1】:

根据Ian Kemp's回复this question, 这可以使用System.Net.Http.WinHttpHandler 库在.NET Framework 项目中完成。 (我只是在这里添加答案的相关部分,但我建议去查看他的完整答案

首先,从 Nuget 安装 System.Net.Http.WinHttpHandler 库,然后将其用作您的 http 客户端处理程序,如下所述:

var handler = new WinHttpHandler();
var client = new HttpClient(handler);
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("some url"),
    Content = new StringContent("some json", Encoding.UTF8, ContentType.Json),
};

var response = await client.SendAsync(request).ConfigureAwait(false);
//Handle the response as you see fit

【讨论】:

  • 我忘了回来发帖,但我在另一个帖子上找到了这个答案,它对我有用。
【解决方案2】:

使用 HTTP 方法 GET,正文没有意义。根据 HTTP 规范,它将被忽略。使用 GET http 动词从 API 获取资源时,您可以选择传递查询字符串 (http://somedomain.com/api/getValues?key=1) 或直接在 url 中传递参数 (http://somedomain.com/api/getValues/1)

要在您的控制器中接收它,您必须期望这样的参数或查询字符串:

如果参数在 URL 中:

[HttpGet("/api/getValues/{id}")]
public async Task<IActionResult> GetValues(int id){}

(确保您在函数中的参数名称与您在路由中给它的名称匹配)

如果参数是查询字符串:

[HttpGet("/api/getValues")]
public async Task<IActionResult> GetValues(string key){}

(确保查询字符串键名与函数中的参数名匹配)

最佳做法是在 URL 中使用参数。查询字符串非常有用,但是您必须知道何时使用它,例如,如果您想缩小给定某些值的结果,您可以通过查询字符串发送它们。

【讨论】:

  • The HTTP method GET does not allow passing a body. 这不是真的。 stackoverflow.com/questions/978061/http-get-with-request-body
  • 引用同一个线程,它说“但是,GET 的服务器语义受到限制,因此主体(如果有)对请求没有语义意义”。在提出任何论点之前通读一遍:)
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
相关资源
最近更新 更多