RestClient.Net is a powerful .NET REST API client that features task-based async, strong types, and dependency injection support for all platforms. Use it to consume ASP.NET Core Web APIs or interact with RESTful APIs over the internet in C#, F#, or Visual Basic. It's designed with functional-style programming and F# in mind.
NuGet: RestClient.Net
This release updates all dependencies and targets major versions of .NET: 4.5, 5, 6, and 7.
ILogger
for logging all aspects of HTTP calls.For a complete set of examples, see these unit tests.
POST an Object and get Responseusing var client = //Build the Url from the host name new Client("jsonplaceholder.typicode.com".ToHttpsUriFromHost()); UserPost userPost = await client.PostAsync<UserPost, UserPost>( //POST the UserPost to the server new UserPost { title = "Title" }, "posts" );
var serviceCollection = new ServiceCollection() //Add a service which has an IClient dependency .AddSingleton<IGetString, GetString1>() //Add RestClient.Net with a default Base Url of http://www.test.com .AddRestClient((o) => o.BaseUrl = "http://www.test.com".ToAbsoluteUrl()); //Use HttpClient dependency injection _ = serviceCollection.AddHttpClient();Getting a Global IClient in a Service
public class GetString1 : IGetString { public IClient Client { get; } public GetString1(IClient client) => Client = client; public async Task<string> GetStringAsync() => await Client.GetAsync<string>(); }Getting a IClient Using a Factory
public class GetString2 : IGetString { public IClient Client { get; } public GetString2(CreateClient createClient) { //Use the options to set the BaseUrl or other properties on the Client Client = createClient("test", (o) => { o.BaseUrl = o.BaseUrl with { Host = "www.test.com" }; }); } public async Task<string> GetStringAsync() => await Client.GetAsync<string>(); }Make Call and Construct Client
//This constructs an AbsoluteUrl from the string, makes the GET call, and deserializes the JSON to a strongly typed list //The response also contains a Client with the base of the Url that you can reuse //Note: not available on .NET 4.5 var response = await "https://restcountries.eu/rest/v2" .ToAbsoluteUrl() .GetAsync<List<RestCountry>>();Query Github Issues with GraphQL (You must authorize GraphQL Github App)
using RestClient.Net.Abstractions.Extensions; using System.Collections.Generic; using System.Threading.Tasks; using Urls; namespace RestClient.Net { public static class GitHubGraphQLMethods { public static async Task<T> GetIssues<T>(string repo, string accessToken) => (await "https://api.github.com/graphql" .ToAbsoluteUrl() .PostAsync<QueryResponse<T>, QueryRequest>( new QueryRequest("{ search(query: \"repo:" + repo + "\", type: ISSUE, first: 100) {nodes {... on Issue { number title body } } }}") , HeadersExtensions.FromBearerToken(accessToken) .Append("User-Agent", "RestClient.Net"))).Response.Body.data.search; } public record QueryRequest(string query); public record Issue(int? number, string title, string body); public record Issues(List<Issue> nodes); public record Data<T>(T search); public record QueryResponse<T>(Data<T> data); }
[<TestMethod>] member this.TestComposition () = let uri = "host.com".ToHttpUrlFromHost(5000) .AddQueryParameter("fieldname1", "field<>Value1") .WithCredentials("username", "password") .AddQueryParameter("FieldName2", "field<>Value2") .WithFragment("frag") .WithPath("pathpart1", "pathpart2") Assert.AreEqual("http://username:password@host.com:5000/pathpart1/pathpart2?fieldname1=field%3C%3EValue1&FieldName2=field%3C%3EValue2#frag",uri.ToString());
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4