Simple and flexible REST client built on top of Microsoft's System.Net.HttpClient.
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);
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()
};
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;
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;
}
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);