/// <summary> /// Prepares the header requests, copying from the RestFluencing Request to the HttpRequestMessage. /// </summary> /// <param name="request"></param> /// <param name="httpRequest"></param> protected virtual void PrepareRequestHeaders(IApiClientRequest request, HttpRequestMessage httpRequest) { foreach (var h in request.Headers) { httpRequest.Headers.TryAddWithoutValidation(h.Key, h.Value); } }
/// <summary> /// Executes the request and creates an response object /// </summary> /// <param name="request"></param> /// <returns></returns> public IApiClientResponse ExecuteRequest(IApiClientRequest request) { IApiClientResponse result = new ApiClientResponse(); try { HttpClient client = CreateClient(); var httpRequest = CreateHttpRequest(request); PrepareRequestHeaders(request, httpRequest); var contentType = GetContentTypeHeaderValue(request); PrepareRequestContent(request, httpRequest, contentType); // Set the timeout just prior to making the request to reduce the risk of unintended overrides client.Timeout = TimeSpan.FromSeconds(request.TimeoutInSeconds); using (HttpResponseMessage response = client.SendAsync(httpRequest).GetAwaiter().GetResult()) { result.Status = (int)response.StatusCode; result.StatusCode = (HttpStatusCode)(int)response.StatusCode; result.Headers = CreateHeaders(response.Headers, response.Content.Headers); result.Content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); return(result); } } finally { DisposeClient(); } }
/// <summary> /// Executes the request and creates an response object /// </summary> /// <param name="request"></param> /// <returns></returns> public IApiClientResponse ExecuteRequest(IApiClientRequest request) { IApiClientResponse result = new ApiClientResponse(); try { HttpClient client = CreateClient(); var httpRequest = CreateHttpRequest(request); const string contentTypeHeader = "content-type"; string contentType = null; foreach (var h in request.Headers) { //because the api keeps overriding the content type we have to find what we defined before IList <string> values; if (h.Key.Equals(contentTypeHeader, StringComparison.InvariantCultureIgnoreCase) && request.Headers.TryGetValue(h.Key, out values)) { contentType = values.First(); } httpRequest.Headers.TryAddWithoutValidation(h.Key, h.Value); } var multiPartContent = request as MultipartFormClientRequest; if (multiPartContent is null) // default string content behaviour { if (contentType != null) { httpRequest.Content = new StringContent(request.Content, Encoding.UTF8, contentType); } else { httpRequest.Content = new StringContent(request.Content); } } else // the new multipart content { httpRequest.Content = multiPartContent.MultipartContent; } // Set the timeout just prior to making the request to reduce the risk of unintended overrides client.Timeout = TimeSpan.FromSeconds(request.TimeoutInSeconds); using (HttpResponseMessage response = client.SendAsync(httpRequest).GetAwaiter().GetResult()) { result.Status = (int)response.StatusCode; result.StatusCode = (HttpStatusCode)(int)response.StatusCode; result.Headers = CreateHeaders(response.Headers, response.Content.Headers); result.Content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); return(result); } } finally { DisposeClient(); } }
/// <summary> /// Prepares the request content. By default, creates a string content with the provided contentType. /// </summary> /// <param name="request"></param> /// <param name="httpRequest"></param> /// <param name="contentType"></param> protected virtual void PrepareRequestContent(IApiClientRequest request, HttpRequestMessage httpRequest, string contentType) { if (request.Content != null) { if (contentType != null) { httpRequest.Content = new StringContent(request.Content, Encoding.UTF8, contentType); } else { httpRequest.Content = new StringContent(request.Content); } } }
/// <inheritdoc /> protected override void PrepareRequestContent(IApiClientRequest request, HttpRequestMessage httpRequest, string contentType) { var multiPartContent = request as MultipartFormClientRequest; if (multiPartContent is null) { // default string content behaviour base.PrepareRequestContent(request, httpRequest, contentType); } else { // the new multipart content httpRequest.Content = multiPartContent.MultipartContent; } }
public IApiClientResponse ExecuteRequest(IApiClientRequest request) { if (Responses[request.Uri.AbsolutePath] == null) { return(new ApiClientResponse() { Content = "", StatusCode = HttpStatusCode.OK }); } return(new ApiClientResponse() { Content = JsonConvert.SerializeObject(Responses[request.Uri.AbsolutePath]), StatusCode = HttpStatusCode.OK }); }
/// <summary> /// Executes the request and creates an response object /// </summary> /// <param name="request"></param> /// <returns></returns> public IApiClientResponse ExecuteRequest(IApiClientRequest request) { using (HttpClient client = new HttpClient()) { IApiClientResponse result = new ApiClientResponse(); var httpRequest = new HttpRequestMessage(new HttpMethod(request.Verb.ToString().ToUpper()), request.Uri); const string contentTypeHeader = "content-type"; string contentType = null; foreach (var h in request.Headers) { //because the api keeps overriding the content type we have to find what we defined before IList <string> values; if (h.Key.Equals(contentTypeHeader, StringComparison.InvariantCultureIgnoreCase) && request.Headers.TryGetValue(h.Key, out values)) { contentType = values.First(); } httpRequest.Headers.TryAddWithoutValidation(h.Key, h.Value); } if (request.Content != null) { if (contentType != null) { httpRequest.Content = new StringContent(request.Content, Encoding.UTF8, contentType); } else { httpRequest.Content = new StringContent(request.Content); } } // Set the timeout just prior to making the request to reduce the risk of unintended overrides (TODO make the HttpClient a singleton) client.Timeout = TimeSpan.FromSeconds(request.TimeoutInSeconds); using (HttpResponseMessage response = client.SendAsync(httpRequest).GetSyncResult()) { result.Status = (int)response.StatusCode; result.StatusCode = (HttpStatusCode)(int)response.StatusCode; result.Headers = CreateHeaders(response.Content.Headers); result.Content = response.Content.ReadAsStringAsync().GetSyncResult(); return(result); } } }
/// <summary> /// Retrieves the Content Type header defined in the RestFluencing Request. /// </summary> /// <param name="request"></param> /// <returns></returns> protected virtual string GetContentTypeHeaderValue(IApiClientRequest request) { //because the api keeps overriding the content type we have to find what we defined before const string contentTypeHeader = "content-type"; string contentType = null; foreach (var h in request.Headers) { IList <string> values; if (h.Key.Equals(contentTypeHeader, StringComparison.InvariantCultureIgnoreCase) && request.Headers.TryGetValue(h.Key, out values)) { contentType = values.First(); } } return(contentType); }
public IApiClientResponse ExecuteRequest(IApiClientRequest request) { if (Responses[request.Uri.AbsolutePath] == null) { return(new ApiClientResponse() { Content = "", StatusCode = HttpStatusCode.OK, Headers = new Dictionary <string, IEnumerable <string> >() }); } return(new ApiClientResponse() { Content = JsonConvert.SerializeObject(Responses[request.Uri.AbsolutePath]), StatusCode = HttpStatusCode.OK, Headers = new Dictionary <string, IEnumerable <string> >() }); }
/// <summary> /// Creates the HttpRequestMessage from the IApiClientRequest /// </summary> /// <param name="request"></param> /// <returns></returns> protected virtual HttpRequestMessage CreateHttpRequest(IApiClientRequest request) { return(new HttpRequestMessage(new HttpMethod(request.Verb.ToString().ToUpper()), request.Uri)); }