我正在使用 HttpClient 獲取和發布對我的 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);
}
uj5u.com熱心網友回復:
對于 Get 請求,沒有正文可將序列化的“請求”放入其中。您可以將序列化的“請求”放入查詢字串引數中,但對 Url 的總長度有限制。如果可以,請始終使用 Post。
uj5u.com熱心網友回復:
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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/422408.html
標籤:
