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.
我正在使用 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.