I use the following ApiClient Class in a c# MVC UI Layer:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
namespace DocumentManager.UI
{
public class ApiClient<T>
{
public ApiClientErrorTypes Error{get;private set;}
private string baseUri = @"http://localhost/DocumentManager.WebAPI/";
public T ApiGet(string requestUrl)
{
using (var client = new HttpClient())
{
var requestUri = new Uri(baseUri + requestUrl);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
if (ApiAuthToken.token != null)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiAuthToken.token.ToString());
}
var response = client.GetAsync(requestUri).Result;
string contentString = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
T result = JsonConvert.DeserializeObject<T>(contentString);
return result;
}
if (int.Parse(response.StatusCode.ToString()) > 400 && int.Parse(response.StatusCode.ToString()) <= 499)
Error = ApiClientErrorTypes.UnAuthorised;
else
Error = ApiClientErrorTypes.Technical;
return default(T);
}
}
public T ApiPost(string requestUrl, HttpContent encodedContent)
{
using(var client = new HttpClient())
{
var requestUri = new Uri(baseUri + requestUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
if (ApiAuthToken.token != null)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiAuthToken.token.ToString());
}
var response = client.PostAsync(requestUri, encodedContent).Result;
string contentString = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
T result = JsonConvert.DeserializeObject<T>(contentString);
return result;
}
if (int.Parse(response.StatusCode.ToString()) > 400 && int.Parse(response.StatusCode.ToString()) <= 499)
Error = ApiClientErrorTypes.UnAuthorised;
else
Error = ApiClientErrorTypes.Technical;
return default(T);
}
}
public bool ApiPostBool(string requestUrl, HttpContent encodedContent)
{
using (var client = new HttpClient())
{
var requestUri = new Uri(baseUri + requestUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
if (ApiAuthToken.token != null)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiAuthToken.token.ToString());
}
var response = client.PostAsync(requestUri, encodedContent).Result;
string contentString = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
return true;
}
return false;
}
}
}
}
And I call this in the following way from the MVC controller:
var apiClient = new ApiClient<Document>();
var doc = apiClient.ApiGet("api/document/get/" + id);
if (doc != null)
{
//do stuff here
}
I use the following Web API layer method to return this item
namespace DocumentManager.WebApi.Controllers
{
[RoutePrefix("api/document")]
public class DocumentController : BaseController
{
[Route("get/{id}")]
public IHttpActionResult Get(int id)
{
return Ok(DACDocument.Read(new DataContext(),id));
}
}
}
there is an entityframework data layer behind this (DAC...)
The reason I use this architectural structure is that I want multiple MVC UI front end apps to tie into the API back end.
projects in the solution are
Data (class Library)
API (Web API)
UI (Web MVC)
If this helps please mark as answer!
TestServicewould be meant to deal with concrete derived classes ofApiRequestandApiResponse? e.g.TestService : ApiService<TestRequest, TestResponse>?