From 471ece8d637db64026c7090155fedc9884a1c175 Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 13 May 2020 21:24:43 +0100 Subject: [PATCH] Split http request off --- .../Interfaces/IProcessApiResponse.cs | 5 +- .../Interfaces/ISingleVehicleService.cs | 2 +- DVSA.MOT.SDK/Services/ProcessApiResponse.cs | 54 +++++++++++++++-- DVSA.MOT.SDK/Services/SingleVehicleService.cs | 60 ++++--------------- 4 files changed, 63 insertions(+), 58 deletions(-) diff --git a/DVSA.MOT.SDK/Interfaces/IProcessApiResponse.cs b/DVSA.MOT.SDK/Interfaces/IProcessApiResponse.cs index 5e952a1..44aa7ea 100644 --- a/DVSA.MOT.SDK/Interfaces/IProcessApiResponse.cs +++ b/DVSA.MOT.SDK/Interfaces/IProcessApiResponse.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using System.Net; -using System.Net.Http; using System.Threading.Tasks; using DVSA.MOT.SDK.Models; @@ -8,7 +6,6 @@ namespace DVSA.MOT.SDK.Interfaces { public interface IProcessApiResponse { - Task> ConvertToObject(HttpContent json); - string ResponseMessage(HttpStatusCode statusCode); + Task GetData(List> parameters); } } \ No newline at end of file diff --git a/DVSA.MOT.SDK/Interfaces/ISingleVehicleService.cs b/DVSA.MOT.SDK/Interfaces/ISingleVehicleService.cs index 2aeb0d0..6ab9985 100644 --- a/DVSA.MOT.SDK/Interfaces/ISingleVehicleService.cs +++ b/DVSA.MOT.SDK/Interfaces/ISingleVehicleService.cs @@ -7,6 +7,6 @@ namespace DVSA.MOT.SDK.Interfaces public interface ISingleVehicleService { Task GetSingleVehicleMotHistoryByRegistration(string registration); - MotTestResponses GetSingleVehicleMotHistoryById(string id); + Task GetSingleVehicleMotHistoryById(string id); } } diff --git a/DVSA.MOT.SDK/Services/ProcessApiResponse.cs b/DVSA.MOT.SDK/Services/ProcessApiResponse.cs index 261c37a..a757f91 100644 --- a/DVSA.MOT.SDK/Services/ProcessApiResponse.cs +++ b/DVSA.MOT.SDK/Services/ProcessApiResponse.cs @@ -2,32 +2,62 @@ using System.Collections.Generic; using System.Net; using System.Net.Http; +using System.Net.Http.Headers; using System.Threading.Tasks; +using System.Web; using DVSA.MOT.SDK.Interfaces; using DVSA.MOT.SDK.Models; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Newtonsoft.Json; namespace DVSA.MOT.SDK.Services { public class ProcessApiResponse : IProcessApiResponse { + private readonly IOptions _apiKey; private readonly ILogger _logger; - public ProcessApiResponse(ILogger logger) + public ProcessApiResponse(ILogger logger, IOptions apiKey) { _logger = logger; + _apiKey = apiKey; } + public async Task GetData(List> parameters) + { + var apiResponse = new ApiResponse(); + using (var httpClient = new HttpClient()) + { + httpClient.DefaultRequestHeaders.Clear(); + httpClient.DefaultRequestHeaders.Accept.Add( + new MediaTypeWithQualityHeaderValue(Constants.ApiAcceptHeader)); + httpClient.DefaultRequestHeaders.Add(Constants.ApiKeyHeader, _apiKey.Value.DVSAApiKey); - public async Task> ConvertToObject(HttpContent httpContent) + var url = GenerateUrl(parameters); + var request = await httpClient.GetAsync(url); + apiResponse.ReasonPhrase = request.ReasonPhrase; + apiResponse.StatusCode = (int)request.StatusCode; + var responseMessage = ResponseMessage(request.StatusCode); + apiResponse.ResponseMessage = responseMessage; + apiResponse.VehicleDetails = await ConvertToObject(request.Content); + + if (!request.IsSuccessStatusCode) + { + _logger.Log(LogLevel.Error, responseMessage); + } + return apiResponse; + } + } + + private async Task> ConvertToObject(HttpContent httpContent) { try { - if (httpContent == null) + if (httpContent == null) return null; var json = await httpContent.ReadAsStringAsync(); - if (string.IsNullOrEmpty(json)) + if (string.IsNullOrEmpty(json)) return null; var motTestResponses = JsonConvert.DeserializeObject>(json); @@ -40,7 +70,7 @@ public async Task> ConvertToObject(HttpContent httpContent) } } - public string ResponseMessage(HttpStatusCode statusCode) + private string ResponseMessage(HttpStatusCode statusCode) { var responseMessage = string.Empty; try @@ -88,5 +118,19 @@ public string ResponseMessage(HttpStatusCode statusCode) return responseMessage; } } + + private static string GenerateUrl(IEnumerable> parameters) + { + var baseURl = $"{Constants.ApiRootUrl}{Constants.ApiPath}"; + var uriBuilder = new UriBuilder(baseURl); + var query = HttpUtility.ParseQueryString(uriBuilder.Query); + foreach (var param in parameters) + { + query.Add(param.Key, param.Value); + } + uriBuilder.Query = query.ToString(); + baseURl = uriBuilder.ToString(); + return baseURl; + } } } diff --git a/DVSA.MOT.SDK/Services/SingleVehicleService.cs b/DVSA.MOT.SDK/Services/SingleVehicleService.cs index b252883..37b0b7f 100644 --- a/DVSA.MOT.SDK/Services/SingleVehicleService.cs +++ b/DVSA.MOT.SDK/Services/SingleVehicleService.cs @@ -1,23 +1,19 @@ using System; -using System.Net.Http; -using System.Net.Http.Headers; +using System.Collections.Generic; using System.Threading.Tasks; using DVSA.MOT.SDK.Interfaces; using DVSA.MOT.SDK.Models; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; namespace DVSA.MOT.SDK.Services { public class SingleVehicleService : ISingleVehicleService { private readonly IProcessApiResponse _processApiResponse; - private readonly IOptions _apiKey; private readonly ILogger _logger; - public SingleVehicleService(IOptions apiKey, ILogger logger, IProcessApiResponse processApiResponse) + public SingleVehicleService(ILogger logger, IProcessApiResponse processApiResponse) { - _apiKey = apiKey; _logger = logger; _processApiResponse = processApiResponse; } @@ -27,32 +23,16 @@ public async Task GetSingleVehicleMotHistoryByRegistration(string r try { var apiResponse = new ApiResponse(); - string responseMessage; if (!string.IsNullOrEmpty(registration)) { - using (var httpClient = new HttpClient()) + var parameters = new List> { - httpClient.DefaultRequestHeaders.Clear(); - httpClient.DefaultRequestHeaders.Accept.Add( - new MediaTypeWithQualityHeaderValue(Constants.ApiAcceptHeader)); - httpClient.DefaultRequestHeaders.Add(Constants.ApiKeyHeader, _apiKey.Value.DVSAApiKey); - - var request = await httpClient.GetAsync($"{Constants.ApiRootUrl}{Constants.ApiPath}?{Constants.Parameters.Registration}={registration}"); - apiResponse.ReasonPhrase = request.ReasonPhrase; - apiResponse.StatusCode = (int)request.StatusCode; - responseMessage = _processApiResponse.ResponseMessage(request.StatusCode); - apiResponse.ResponseMessage = responseMessage; - apiResponse.VehicleDetails = await _processApiResponse.ConvertToObject(request.Content); - - if (!request.IsSuccessStatusCode) - { - _logger.Log(LogLevel.Error, responseMessage); - } - return apiResponse; - } + new KeyValuePair(Constants.Parameters.Registration, registration) + }; + return await _processApiResponse.GetData(parameters); } - responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException; + var responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException; _logger.Log(LogLevel.Error, responseMessage); apiResponse.ResponseMessage = responseMessage; return apiResponse; @@ -68,32 +48,16 @@ public async Task GetSingleVehicleMotHistoryById(string id) try { var apiResponse = new ApiResponse(); - string responseMessage; if (!string.IsNullOrEmpty(id)) { - using (var httpClient = new HttpClient()) + var parameters = new List> { - httpClient.DefaultRequestHeaders.Clear(); - httpClient.DefaultRequestHeaders.Accept.Add( - new MediaTypeWithQualityHeaderValue(Constants.ApiAcceptHeader)); - httpClient.DefaultRequestHeaders.Add(Constants.ApiKeyHeader, _apiKey.Value.DVSAApiKey); - - var request = await httpClient.GetAsync($"{Constants.ApiRootUrl}{Constants.ApiPath}?{Constants.Parameters.Registration}={id}"); - apiResponse.ReasonPhrase = request.ReasonPhrase; - apiResponse.StatusCode = (int)request.StatusCode; - responseMessage = _processApiResponse.ResponseMessage(request.StatusCode); - apiResponse.ResponseMessage = responseMessage; - apiResponse.VehicleDetails = await _processApiResponse.ConvertToObject(request.Content); - - if (!request.IsSuccessStatusCode) - { - _logger.Log(LogLevel.Error, responseMessage); - } - return apiResponse; - } + new KeyValuePair(Constants.Parameters.VehicleId, id) + }; + return await _processApiResponse.GetData(parameters); } - responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException; + var responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException; _logger.Log(LogLevel.Error, responseMessage); apiResponse.ResponseMessage = responseMessage; return apiResponse;