using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Net.Http; using Newtonsoft.Json; namespace Helpers.WebApi { public class WebApiResponse<T> { public WebApiResponse(string url, HttpResponseMessage response, string content, T result) { Url = url; Response = response; Content = content; Result = result; } public readonly string Url; public readonly HttpResponseMessage Response; public HttpStatusCode Status { get { return Response.StatusCode; } } public readonly string Content; public readonly T Result; } public static class WebApiHelper { private const string AuthorizationHeader = "Authorization"; public class WebApiClient : IDisposable { public WebApiClient(string apiAddress, NetworkCredential credentials) { this.apiAddress = apiAddress; this.credentials = credentials; } private readonly string apiAddress; private readonly NetworkCredential credentials; private HttpClient httpClient; private void Prepare() { if (httpClient == null) { HttpClientHandler httpClientHandler = new HttpClientHandler() { }; httpClient = new HttpClient(httpClientHandler); } } private string GetUrl(params string[] parts) { var partList = new List<string> { apiAddress.TrimEnd('/') }; partList.AddRange(parts.Where(part => !string.IsNullOrEmpty(part))); return string.Join("/", partList); } public async Task<WebApiResponse<T>> Request<T>(HttpMethod method, HttpStatusCode expectStatus, string content, params string[] parts) { Prepare(); var uri = GetUrl(parts); HttpRequestMessage requestMessage = new HttpRequestMessage(method, uri); if (credentials != null && !String.IsNullOrEmpty(credentials.UserName)) { var headerValue = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(String.Format("{0}:{1}", credentials.UserName, credentials.Password))); requestMessage.Headers.Add(AuthorizationHeader, headerValue); } if (!string.IsNullOrEmpty(content)) { requestMessage.Content = new StringContent(content, Encoding.UTF8, "application/json"); } DateTime startTime = DateTime.Now; var responseMessage = await httpClient.SendAsync(requestMessage).ConfigureAwait(continueOnCapturedContext: false); var responseContent = await responseMessage.Content.ReadAsStringAsync(); var endTime = DateTime.Now; if (responseMessage.StatusCode == HttpStatusCode.Unauthorized) { throw new UnauthorizedAccessException(string.Format("Unauthorized; Url: {0}", uri)); } else if (responseMessage.StatusCode != expectStatus && expectStatus != HttpStatusCode.Unused) { throw new Exception(string.Format("[{0}]\r\n[Error, status not expected: {1}]\r\n{2}", uri, responseMessage.StatusCode, responseContent)); } if (typeof(T) != typeof(string)) { return new WebApiResponse<T>(uri, responseMessage, responseContent, JsonConvert.DeserializeObject<T>(responseContent)); } // Return the request content as string return new WebApiResponse<T>(uri, responseMessage, responseContent, (T)Convert.ChangeType(responseContent, typeof(T))); } public async Task<WebApiResponse<T>> Get<T>(params string[] parts) { return await Request<T>(HttpMethod.Get, HttpStatusCode.OK, null, parts); } public async Task<WebApiResponse<T>> Get<T>(HttpStatusCode expectStatus, params string[] parts) { return await Request<T>(HttpMethod.Get, expectStatus, null, parts); } public async Task<WebApiResponse<T>> Post<T>(object content, params string[] parts) { return await Request<T>(HttpMethod.Post, HttpStatusCode.Created, JsonConvert.SerializeObject(content), parts); } public async Task<WebApiResponse<T>> Post<T>(object content, HttpStatusCode expectStatus, params string[] parts) { return await Request<T>(HttpMethod.Post, expectStatus, JsonConvert.SerializeObject(content), parts); } public async Task<WebApiResponse<T>> Put<T>(object content, params string[] parts) { return await Request<T>(HttpMethod.Put, HttpStatusCode.OK, JsonConvert.SerializeObject(content), parts); } public async Task<WebApiResponse<T>> Put<T>(object content, HttpStatusCode expectStatus, params string[] parts) { return await Request<T>(HttpMethod.Put, expectStatus, JsonConvert.SerializeObject(content), parts); } public async Task<WebApiResponse<T>> Delete<T>(params string[] parts) { return await Request<T>(HttpMethod.Delete, HttpStatusCode.OK, null, parts); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } public virtual void Dispose(bool disposing) { if (disposing) { if (httpClient != null) httpClient.Dispose(); } } } } } // Usage: using (var client = new WebApiClient("http://server.com:3000/", new NetworkCredential("User", "Password"))) { var response = await client.Get<User>("api/users/12"); if (response.Status == System.Net.HttpStatusCode.OK) { var userName = response.Result.Name; } }
87100cookie-checkC# WebApiHelper