Вызывающий универсальный API C # с другим запросом и ответом

#c#

#c#

Вопрос:

У меня есть интерфейсное приложение MVC, которое использует общий веб-вызывающий для доступа к внутреннему API. В настоящее время он всегда использует одни и те же типы объектов запроса и ответа.

 public static async Task<T> CallPostWebApi<T>(T t, string serviceUrl)
  

который преобразует t в json и передает в API

 var json = JsonConvert.SerializeObject(t);
var formData = new StringContent(json, Encoding.UTF8, "application/json");

var response = await client.PostAsync(serviceUrl, formData);
  

и возвращает тот же тип объекта, что и ответ:

 var data = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(data);
  

итак, я могу назвать это следующим образом:

 return await ApiCaller.CallPostWebApi(inputModel, _url);
  

но что нужно уметь делать сейчас, так это отправлять другой объект запроса объекту ответа. Итак, я хочу иметь возможность вызывать

 return await ApiCaller.CallPostWebAPI(inputModel, outputModel, _url);
  

Я пытался реализовать статический метод в ApiCaller, используя разные общие комбинации, но, похоже, ни одна из них не работает.

Комментарии:

1. Возможно, вы захотите переименовать это, это технически неверно и вводит в заблуждение: var formData = new StringContent(json, Encoding.UTF8, "application/json") . formData должно быть jsonContent или только content событие

Ответ №1:

Это должно быть довольно тривиально сделать, если вы используете 2 общих параметра:

 public static async Task<TResponse> CallPostWebApi<TRequest, TResponse>(TRequest request, string serviceUrl)
{
    ...
    return JsonConvert.DeserializeObject<TResponse>(data);
}   
  

Обратите внимание, однако, что при вызове метода вам придется указать оба параметра:

 var response = await CallPostWebApi<SomeRequest, SomeResponse>(request, "url");
  

Комментарии:

1. это здорово, спасибо. Вызов выглядит следующим образом: var response = await CallPostWebApi(запрос, ответ, URL)