Skip to content

Latest commit

 

History

History
113 lines (96 loc) · 3.35 KB

File metadata and controls

113 lines (96 loc) · 3.35 KB

RestHttpClient

Simple and flexible REST client built on top of Microsoft's System.Net.HttpClient.

Usage

var client = new RestHttpClient
{
    BaseAddress = new Uri("https://jsonplaceholder.typicode.com")
};

var list = await client.RestGetAsync<List<Todo>>("todos");

var todo = await client.RestGetAsync<Todo>("todos/1");

var model = new Todo
{
    Title = "Lorem Ipsum",
    UserId = 1
};

var createdTodo = await client.RestPostAsync<Todo>("todos", model);

Customize serialization

Implement one of ISerializer, IDeserializer, IConverter (combination of both) and set to according property on RestHttpClient:

var client = new RestHttpClient
{
    BaseAddress = new Uri("https://jsonplaceholder.typicode.com"),
    Converter = new JsonRestConverter()
};

Authorization

For per-object authentication, just set HttpClient's default headers:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic","QWxhZGRpbjpvcGVuIHNlc2FtZQ==");

For per-request authentication, set a method or expression returning Task to AuthenticationHandler method. You can use Lambda syntax:

client.AuthenticationHandler = async (request) =>
{
    request.Headers.Add("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==");
}

You can use regular method syntax:

async Task AuthenticateRequestAsync(HttpRequestMessage request)
{
    request.Headers.Add("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==");
}
//And somethere else:
client.AuthenticationHandler = AuthenticateRequestAsync;

Error handling

Set a method or expression to ErrorHandler property:

client.ErrorHandler = async (request, response) =>
{
    //Use request and response object to determine which action to take
    if (request.RequestUri.AbsolutePath.StartsWith("/api") && response.StatusCode == HttpStatusCode.Unauthorized)
    {
        //In this case we set Authentication global header...
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic","QWxhZGRpbjpvcGVuIHNlc2FtZQ==");
        ///...and then resend a copy of the request, then return its response.
        return await client.SendAsync(request.Clone());
    }

    //If you don't wish to handle an error, just return back the response object
    return response;
};

If there isn't an error handler or Response is null or unsuccessful after error handling, RestException will be thrown:

try
{
    var item = await client.RestGetAsync<Todo>("todos/800");
}
//Use RestException's Request, Response or Content properties to determine how to handle the Exception
catch (RestException ex) when (ex.Response?.StatusCode == HttpStatusCode.NotFound)
{
    Console.WriteLine("Content not found.");
}
catch (RestException ex)
{
    Console.WriteLine("Request failed, check out its content: ");
    Console.Write(ex.Content);
    throw;
}

Less common cases

For less common cases, write your request using the HttpRequestMessage class and send it throuth one of the available RestSendAsync overloads:

var json = "{ title: 'Lorem Ipsum', userId: 1 }";

var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    Content = new StringContent(json, Encoding.UTF8, "application/json"),
    RequestUri = new Uri("todos", UriKind.Relative)
};

var response = await client.RestSendAsync(request);

Assert.True(response.IsSuccessStatusCode);