c# HttpClient,如何使用通用模型参数获取请求?

c# HttpClient, how to get request with generic model parameter?

我正在使用 HttpClient 获取和 post 请求到我的 WebAPI。但我使用的是通用 Get。

我的问题是如何将 T 泛型对象绑定到 GetAsync 方法?

例如,在我的 POST 请求中,我可以像这样使用通用 T:

public async Task<TResponse> Post<TRequest, TResponse>(TRequest request, string urlToSend)
    {
        try
        {
            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.BaseAddress = new Uri(_url);
                var serialized = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
                var httpResponseMessage = await httpClient.PostAsync(urlToSend, serialized);
                //httpResponseMessage.EnsureSuccessStatusCode();
                if (httpResponseMessage.IsSuccessStatusCode)
                {
                    //var responseResultRaw = httpResponseMessage.Content.ReadAsStringAsync().Result;
                    var responseString = JsonConvert.DeserializeObject<TResponse>(httpResponseMessage.Content.ReadAsStringAsync().Result);

                    return responseString;
                }
                else /*if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.BadRequest)*/
                {
                    var errorRes = JsonConvert.DeserializeObject<TResponse>(httpResponseMessage.Content.ReadAsStringAsync().Result);
                    return errorRes;
                }
                throw new Exception(httpResponseMessage.ReasonPhrase);
            }
        }
        catch (Exception e)
        {
            return default;
        }
    }

但是我没有找到任何示例说明如何将我的通用 TRequest 插入到 GetAsync()。

这是我的代码:

public async Task<TResponse> GetByFilter(TRequest request, string urlToRequest)
    {
        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri(_url);
            var response = await client.GetAsync(urlToRequest);
            var responseString = await response.Content.ReadAsStringAsync();
            var responseJson = JsonConvert.DeserializeObject<TResponse>(responseString);
            return responseJson;
        }

        throw new NotImplementedException();
    }

简单地说,我的问题是我可以在 GetAsync() 方法中使用模型,例如 httpClient.PostAsync(urlToSend, serialized);

我的API控制器方法是这样的:

[HttpGet("getfirmdetail")]
    public IActionResult GetFirmDetail([FromBody]FirmDetailRequestDto firmDetailRequestDto)
    {

        return BadRequest(firmDetailRequestDto);
    }

GET 请求没有正文,因此您必须传递 URL 中的所有参数,在您的示例中为属性 urlToRequest。

否则,如果您使用的是 NET Core,则可以使用:

public async Task<TResponse> GetByFilter(TRequest request, string urlToRequest)
    {
        using (HttpClient client = new HttpClient())
        {
            var jsonBody= Newtonsoft.Json.JsonConvert.SerializeObject(request)
            var requestGet = new HttpRequestMessage
           {
              Method = HttpMethod.Get,
              RequestUri = new Uri(urlToRequest),
              Content = new StringContent(jsonBody, Encoding.UTF8, ContentType.Json),
           };
            var resp = await client.SendAsync(requestGet).ConfigureAwait(false);
            var responseString = await resp.Content.ReadAsStringAsync().ConfigureAwait(false);
            var responseJson = JsonConvert.DeserializeObject<TResponse>(responseString);
            return responseJson;
        }
    }

对于 Get 请求,没有主体可以放入序列化的 'request'。您可以将序列化的 'request' 放入查询字符串参数中,但是 [= 的总长度有限制15=]。如果可以,请始终使用 Post.