{"id":871,"date":"2017-09-11T10:51:50","date_gmt":"2017-09-11T09:51:50","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=871"},"modified":"2020-11-06T17:07:41","modified_gmt":"2020-11-06T16:07:41","slug":"c-webapihelper","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-webapihelper\/","title":{"rendered":"C# WebApiHelper"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Net;\nusing System.Net.Http;\nusing Newtonsoft.Json;\n\nnamespace Helpers.WebApi\n{\n    public class WebApiResponse&lt;T>\n    {\n        public WebApiResponse(string url, HttpResponseMessage response, string content, T result)\n        {\n            Url = url;\n            Response = response;\n            Content = content;\n            Result = result;\n        }\n        public readonly string Url;\n        public readonly HttpResponseMessage Response;\n        public HttpStatusCode Status { get { return Response.StatusCode; } }\n        public readonly string Content;\n        public readonly T Result;\n    }\n\n    public static class WebApiHelper\n    {\n        private const string AuthorizationHeader = \"Authorization\";\n\n        public class WebApiClient : IDisposable\n        {\n            public WebApiClient(string apiAddress, NetworkCredential credentials)\n            {\n                this.apiAddress = apiAddress;\n                this.credentials = credentials;\n            }\n            private readonly string apiAddress;\n            private readonly NetworkCredential credentials;\n            private HttpClient httpClient;\n\n            private void Prepare()\n            {\n                if (httpClient == null)\n                {\n                    HttpClientHandler httpClientHandler = new HttpClientHandler() { };\n                    httpClient = new HttpClient(httpClientHandler);\n                }\n            }\n\n            private string GetUrl(params string[] parts)\n            {\n                var partList = new List&lt;string> { apiAddress.TrimEnd('\/') };\n                partList.AddRange(parts.Where(part => !string.IsNullOrEmpty(part)));\n                return string.Join(\"\/\", partList);\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Request&lt;T>(HttpMethod method, HttpStatusCode expectStatus, string content, params string[] parts)\n            {\n                Prepare();\n                var uri = GetUrl(parts);\n                HttpRequestMessage requestMessage = new HttpRequestMessage(method, uri);\n\n                if (credentials != null &amp;&amp; !String.IsNullOrEmpty(credentials.UserName))\n                {\n                    var headerValue = \"Basic \" + Convert.ToBase64String(Encoding.UTF8.GetBytes(String.Format(\"{0}:{1}\", credentials.UserName, credentials.Password)));\n                    requestMessage.Headers.Add(AuthorizationHeader, headerValue);\n                }\n\n                if (!string.IsNullOrEmpty(content))\n                {\n                    requestMessage.Content = new StringContent(content, Encoding.UTF8, \"application\/json\");\n                }\n\n                DateTime startTime = DateTime.Now;\n                var responseMessage = await httpClient.SendAsync(requestMessage).ConfigureAwait(continueOnCapturedContext: false);\n                var responseContent = await responseMessage.Content.ReadAsStringAsync();\n                var endTime = DateTime.Now;\n\n                if (responseMessage.StatusCode == HttpStatusCode.Unauthorized)\n                {\n                    throw new UnauthorizedAccessException(string.Format(\"Unauthorized; Url: {0}\", uri));\n                }\n                else if (responseMessage.StatusCode != expectStatus &amp;&amp; expectStatus != HttpStatusCode.Unused)\n                {\n                    throw new Exception(string.Format(\"[{0}]\\r\\n[Error, status not expected: {1}]\\r\\n{2}\", uri, responseMessage.StatusCode, responseContent));\n                }\n\n                if (typeof(T) != typeof(string))\n                {\n                    return new WebApiResponse&lt;T>(uri, responseMessage, responseContent, JsonConvert.DeserializeObject&lt;T>(responseContent));\n                }\n                \/\/ Return the request content as string\n                return new WebApiResponse&lt;T>(uri, responseMessage, responseContent, (T)Convert.ChangeType(responseContent, typeof(T)));\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Get&lt;T>(params string[] parts)\n            {\n                return await Request&lt;T>(HttpMethod.Get, HttpStatusCode.OK, null, parts);\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Get&lt;T>(HttpStatusCode expectStatus, params string[] parts)\n            {\n                return await Request&lt;T>(HttpMethod.Get, expectStatus, null, parts);\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Post&lt;T>(object content, params string[] parts)\n            {\n                return await Request&lt;T>(HttpMethod.Post, HttpStatusCode.Created, JsonConvert.SerializeObject(content), parts);\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Post&lt;T>(object content, HttpStatusCode expectStatus, params string[] parts)\n            {\n                return await Request&lt;T>(HttpMethod.Post, expectStatus, JsonConvert.SerializeObject(content), parts);\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Put&lt;T>(object content, params string[] parts)\n            {\n                return await Request&lt;T>(HttpMethod.Put, HttpStatusCode.OK, JsonConvert.SerializeObject(content), parts);\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Put&lt;T>(object content, HttpStatusCode expectStatus, params string[] parts)\n            {\n                return await Request&lt;T>(HttpMethod.Put, expectStatus, JsonConvert.SerializeObject(content), parts);\n            }\n\n            public async Task&lt;WebApiResponse&lt;T>> Delete&lt;T>(params string[] parts)\n            {\n                return await Request&lt;T>(HttpMethod.Delete, HttpStatusCode.OK, null, parts);\n            }\n\n            public void Dispose()\n            {\n                Dispose(true);\n                GC.SuppressFinalize(this);\n            }\n\n            public virtual void Dispose(bool disposing)\n            {\n                if (disposing)\n                {\n                    if (httpClient != null)\n                        httpClient.Dispose();\n                }\n            }\n        }\n    }\n}\n\/\/ Usage:\nusing (var client = new WebApiClient(\"http:\/\/server.com:3000\/\", new NetworkCredential(\"User\", \"Password\")))\n{\n    var response = await client.Get&lt;User>(\"api\/users\/12\");\n    if (response.Status == System.Net.HttpStatusCode.OK)\n    {\n        var userName = response.Result.Name;\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-871","post","type-post","status-publish","format-standard","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=871"}],"version-history":[{"count":6,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/871\/revisions"}],"predecessor-version":[{"id":4213,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/871\/revisions\/4213"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}