#c# #generics #asp.net-core-webapi
#c# #дженерики #asp.net-core-webapi
Вопрос:
Я создал вызывающий API, который для запросов post обрабатывает объект ввода и вывода:
public static async Task<TResponse> CallPostWebApi<TRequest, TResponse>(TRequest request, TResponse response, string serviceUrl)
{
using var client = new HttpClient { BaseAddress = new Uri(serviceUrl) };
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
var json = JsonConvert.SerializeObject(request);
var formData = new StringContent(json, Encoding.UTF8, "application/json");
var result = await client.PostAsync(serviceUrl, formData);
if (!result.IsSuccessStatusCode)
{
return response;
}
var data = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<TResponse>(data);
}
мой api теперь возвращает IActionResult с объектом внутри него:
[HttpPost]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[Route("[Action]")]
public IActionResult MethodName(MyModel model)
{
try
{
var result = _reqRepo....
if (result.HasError)
{
return NotFound(result);
}
return Ok(result);
}
catch (Exception exception)
{
return NotFound(exception.Message);
}
}
когда я вызываю это, я не знаю, что установить в качестве возвращаемого объекта
[HttpPost("[Action]")]
public async Task<IActionResult> SubmitConnectionToBilling(ConnectionModel model)
{
return await ApiCaller.CallPostWebApi(model, **???**,
_billingApiUrl "/MyMethod");
}
Комментарии:
1. хорошо, каков тип действия
result
в имени метода? Если ваш вызывающий код имеет доступ к тем же библиотекам классов, он может использовать тот же тип. если нет, вы можете просто определить любой новый класс, который вы хотите, при условии, что его структура соответствует JSON, возвращаемому из сервиса.2. @ADyson это простой класс ошибок { hasError: bool, ErrorMessage: string, errors: string[] }
3. итак, вы можете легко создать простой класс C #, соответствующий этой структуре, и использовать его в качестве возвращаемого типа. например
public class BillingResponse { public bool hasError {get; set; } ...
, etc4. да, наверное, это лучшее решение. Ваше здоровье