如何发送正文为 json 的 GET 请求?

How can I send a GET request with json body?

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

对于HTTP方法GET,正文没有意义。根据 HTTP 规范,它将被忽略。使用 GET http 动词从 API 获取资源时,您可以选择传递查询字符串 (http://somedomain.com/api/getValues?key=1) or pass the parameter directly in the 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中的参数。查询字符串非常有用,但你必须知道什么时候使用它,例如,如果你想缩小给定某些值的结果,你可以将查询字符串发送给它们。

根据Ian Kemp's answer to 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