Refitter 0.2.4-alpha
See the version list below for details.
dotnet tool install --global Refitter --version 0.2.4-alpha
dotnet new tool-manifest
dotnet tool install --local Refitter --version 0.2.4-alpha
#tool dotnet:?package=Refitter&version=0.2.4-alpha&prerelease
nuke :add-package Refitter --version 0.2.4-alpha
Refitter
Refitter is a CLI tool for generating a C# REST API Client using the Refit library.
Installation:
The tool is packaged as a .NET Tool and is published to nuget.org. You can install the latest version of this tool like this:
dotnet tool install --global Refitter --prerelease
Usage:
$ refitter --help
USAGE:
refitter [input file] [OPTIONS]
EXAMPLES:
refitter ./openapi.json --namespace "Your.Namespace.Of.Choice.GeneratedCode" --output ./Output.cs
ARGUMENTS:
[input file] Path to OpenAPI Specification file
OPTIONS:
DEFAULT
-h, --help Prints help information
-n, --namespace GeneratedCode Default namespace to use for generated types
-o, --output Output.cs Path to Output file
--no-auto-generated-header Don't add <auto-generated> header to output file
To generate code from an OpenAPI specifications file, run the following:
$ refitter [path to OpenAPI spec file] --namespace "[Your.Namespace.Of.Choice.GeneratedCode]"
This will generate a file called Output.cs which contains the Refit interface and contract classes generated using NSwag
Here's an example generated output from the Swagger Petstore example
using Refit;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace Your.Namespace.Of.Choice.GeneratedCode
{
public interface ISwaggerPetstore
{
/// <summary>
/// Update an existing pet by Id
/// </summary>
[Put("/pet")]
Task<Pet> UpdatePet([Body]Pet body);
/// <summary>
/// Add a new pet to the store
/// </summary>
[Post("/pet")]
Task<Pet> AddPet([Body]Pet body);
/// <summary>
/// Multiple status values can be provided with comma separated strings
/// </summary>
[Get("/pet/findByStatus")]
Task<ICollection<Pet>> FindPetsByStatus();
/// <summary>
/// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
/// </summary>
[Get("/pet/findByTags")]
Task<ICollection<Pet>> FindPetsByTags();
/// <summary>
/// Returns a single pet
/// </summary>
[Get("/pet/{petId}")]
Task<Pet> GetPetById(long? petId);
[Post("/pet/{petId}")]
Task UpdatePetWithForm(long? petId);
[Delete("/pet/{petId}")]
Task DeletePet(long? petId);
[Post("/pet/{petId}/uploadImage")]
Task<ApiResponse> UploadFile(long? petId, [Body]StreamPart body);
/// <summary>
/// Returns a map of status codes to quantities
/// </summary>
[Get("/store/inventory")]
Task<IDictionary<string, int>> GetInventory();
/// <summary>
/// Place a new order in the store
/// </summary>
[Post("/store/order")]
Task<Order> PlaceOrder([Body]Order body);
/// <summary>
/// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
/// </summary>
[Get("/store/order/{orderId}")]
Task<Order> GetOrderById(long? orderId);
/// <summary>
/// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
/// </summary>
[Delete("/store/order/{orderId}")]
Task DeleteOrder(long? orderId);
/// <summary>
/// This can only be done by the logged in user.
/// </summary>
[Post("/user")]
Task CreateUser([Body]User body);
/// <summary>
/// Creates list of users with given input array
/// </summary>
[Post("/user/createWithList")]
Task<User> CreateUsersWithListInput([Body]ICollection<User> body);
[Get("/user/login")]
Task<string> LoginUser();
[Get("/user/logout")]
Task LogoutUser();
[Get("/user/{username}")]
Task<User> GetUserByName(string username);
/// <summary>
/// This can only be done by the logged in user.
/// </summary>
[Put("/user/{username}")]
Task UpdateUser(string username, [Body]User body);
/// <summary>
/// This can only be done by the logged in user.
/// </summary>
[Delete("/user/{username}")]
Task DeleteUser(string username);
}
}
Using the generated code
RestService
Here's an example usage of the generated code above
using Refit;
using System;
using System.Threading.Tasks;
namespace Your.Namespace.Of.Choice.GeneratedCode;
internal class Program
{
private static async Task Main(string[] args)
{
var client = RestService.For<ISwaggerPetstore>("https://petstore3.swagger.io/api/v3");
var pet = await client.GetPetById(2);
Console.WriteLine($"Name: {pet.Name}");
Console.WriteLine($"Category: {pet.Category.Name}");
Console.WriteLine($"Status: {pet.Status}");
}
}
The RestService class generates an implementation of ISwaggerPetstore that uses HttpClient to make its calls.
The code above when run will output something like this:
Name: Gatitotototo
Category: Chaucito
Status: Sold
ASP.NET Core and HttpClientFactory
Here's an example Minimal API with the Refit.HttpClientFactory library:
using Refit;
using Your.Namespace.Of.Choice.GeneratedCode;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services
.AddRefitClient<ISwaggerPetstore>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri("https://petstore3.swagger.io/api/v3"));
var app = builder.Build();
app.MapGet(
"/pet/{id:long}",
async (ISwaggerPetstore petstore, long id) =>
{
try
{
return Results.Ok(await petstore.GetPetById(id));
}
catch (Refit.ApiException e)
{
return Results.StatusCode((int)e.StatusCode);
}
})
.WithName("GetPetById")
.WithOpenApi();
app.UseHttpsRedirection();
app.UseSwaggerUI();
app.UseSwagger();
app.Run();
.NET Core supports registering the generated ISwaggerPetstore interface via HttpClientFactory
The following request to the API above
$ curl -X 'GET' 'https://localhost:5001/pet/1' -H 'accept: application/json'
Returns a response that looks something like this:
{
"id": 1,
"name": "Special_char_owner_!@#$^&()`.testing",
"photoUrls": [
"https://petstore3.swagger.io/resources/photos/623389095.jpg"
],
"tags": [],
"status": "Sold"
}
System requirements
.NET 7.0
For tips and tricks on software development, check out my blog
If you find this useful and feel a bit generous then feel free to buy me a coffee ☕
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.7.1 | 253,737 | 12/16/2025 |
| 1.7.1-preview.87 | 222 | 12/16/2025 |
| 1.7.0 | 29,276 | 11/6/2025 |
| 1.7.0-preview.86 | 157 | 11/6/2025 |
| 1.6.5 | 269,975 | 10/6/2025 |
| 1.6.5-preview.85 | 146 | 10/6/2025 |
| 1.6.5-preview.84 | 135 | 10/6/2025 |
| 1.6.5-preview.83 | 135 | 10/6/2025 |
| 1.6.5-preview.81 | 139 | 10/6/2025 |
| 1.6.4 | 163,339 | 9/23/2025 |
| 1.6.4-preview.80 | 172 | 9/20/2025 |
| 1.6.3 | 93,487 | 9/18/2025 |
| 1.6.3-preview.79 | 270 | 9/17/2025 |
| 1.6.3-preview.78 | 151 | 9/13/2025 |
| 1.6.3-preview.77 | 157 | 9/11/2025 |
| 1.6.2 | 362,757 | 8/18/2025 |
| 1.6.2-preview.76 | 186 | 8/13/2025 |
| 1.6.1 | 325,656 | 7/8/2025 |
| 1.6.1-preview.75 | 161 | 7/8/2025 |
| 1.6.0 | 131,395 | 6/17/2025 |
| 1.6.0-preview.74 | 396 | 6/10/2025 |
| 1.5.6 | 119,794 | 6/7/2025 |
| 1.5.6-preview.73 | 179 | 5/31/2025 |
| 1.5.5 | 370,251 | 5/4/2025 |
| 1.5.5-preview.70 | 94 | 5/30/2025 |
| 1.5.5-preview.69 | 186 | 4/30/2025 |
| 1.5.4 | 115,908 | 4/26/2025 |
| 1.5.3 | 370,422 | 3/30/2025 |
| 1.5.3-preview.68 | 345 | 3/23/2025 |
| 1.5.3-preview.67 | 634 | 1/30/2025 |
| 1.5.2 | 961,466 | 1/29/2025 |
| 1.5.1 | 87,326 | 1/25/2025 |
| 1.5.1-preview.66 | 119 | 1/25/2025 |
| 1.5.0 | 113,008 | 1/19/2025 |
| 1.5.0-preview.65 | 460 | 12/8/2024 |
| 1.5.0-preview.64 | 121 | 12/7/2024 |
| 1.5.0-preview.63 | 136 | 12/7/2024 |
| 1.4.1 | 957,523 | 11/20/2024 |
| 1.4.1-preview.62 | 226 | 11/4/2024 |
| 1.4.0 | 383,849 | 10/14/2024 |
| 1.4.0-preview.61 | 152 | 10/7/2024 |
| 1.3.2 | 353,670 | 9/23/2024 |
| 1.3.2-preview.60 | 128 | 9/23/2024 |
| 1.3.1 | 74,085 | 9/20/2024 |
| 1.3.0 | 121,916 | 9/14/2024 |
| 1.2.1-preview.59 | 115 | 9/13/2024 |
| 1.2.1-preview.58 | 139 | 9/11/2024 |
| 1.2.1-preview.57 | 127 | 9/11/2024 |
| 1.2.1-preview.56 | 140 | 9/9/2024 |
| 1.2.1-preview.55 | 3,299 | 9/2/2024 |
| 1.2.1-preview.54 | 4,780 | 8/29/2024 |
| 1.2.0 | 586,984 | 8/12/2024 |
| 1.2.0-preview.53 | 5,226 | 8/4/2024 |
| 1.2.0-preview.52 | 1,906 | 7/29/2024 |
| 1.1.3 | 384,955 | 7/19/2024 |
| 1.1.3-preview.51 | 118 | 7/19/2024 |
| 1.1.2 | 50,572 | 7/17/2024 |
| 1.1.2-preview.50 | 105 | 7/16/2024 |
| 1.1.2-preview.49 | 130 | 7/11/2024 |
| 1.1.1 | 213,864 | 7/6/2024 |
| 1.1.1-preview.48 | 137 | 7/4/2024 |
| 1.1.1-preview.47 | 128 | 7/1/2024 |
| 1.1.1-preview.46 | 139 | 6/28/2024 |
| 1.1.0.45-preview | 186 | 6/25/2024 |
| 1.0.2 | 263,661 | 6/13/2024 |
| 1.0.1 | 73,435 | 6/7/2024 |
| 1.0.0 | 271,610 | 5/3/2024 |
| 0.9.9.44-preview | 148 | 4/29/2024 |
| 0.9.9 | 33,197 | 3/7/2024 |
| 0.9.8 | 28,787 | 2/27/2024 |
| 0.9.7 | 97,094 | 2/7/2024 |
| 0.9.6 | 25,314 | 1/29/2024 |
| 0.9.5 | 66,848 | 1/15/2024 |
| 0.9.4.43-preview | 174 | 1/15/2024 |
| 0.9.4 | 57,172 | 1/12/2024 |
| 0.9.3.42-preview | 228 | 1/10/2024 |
| 0.9.2 | 45,193 | 1/10/2024 |
| 0.9.1 | 28,995 | 1/9/2024 |
| 0.9.0 | 28,179 | 1/9/2024 |
| 0.8.7.41-preview | 220 | 1/3/2024 |
| 0.8.7.40-preview | 220 | 12/20/2023 |
| 0.8.7 | 80,114 | 12/18/2023 |
| 0.8.6.39-preview | 224 | 12/14/2023 |
| 0.8.6.38-preview | 264 | 12/14/2023 |
| 0.8.6 | 28,626 | 12/11/2023 |
| 0.8.5 | 82,074 | 11/23/2023 |
| 0.8.4 | 25,456 | 11/7/2023 |
| 0.8.3 | 25,337 | 10/31/2023 |
| 0.8.2 | 25,494 | 10/9/2023 |
| 0.8.1 | 25,969 | 10/4/2023 |
| 0.8.0 | 26,841 | 9/23/2023 |
| 0.7.5 | 27,806 | 9/7/2023 |
| 0.7.4 | 25,442 | 9/6/2023 |
| 0.7.3.37-preview | 317 | 8/25/2023 |
| 0.7.3.36-preview | 362 | 8/25/2023 |
| 0.7.3.35-preview | 356 | 8/21/2023 |
| 0.7.3.34-preview | 348 | 8/15/2023 |
| 0.7.3.33-preview | 319 | 8/12/2023 |
| 0.7.3 | 27,114 | 8/26/2023 |
| 0.7.2.32-preview | 341 | 8/7/2023 |
| 0.7.2 | 28,963 | 8/7/2023 |
| 0.7.1.31-preview | 349 | 8/2/2023 |
| 0.7.1.30-preview | 308 | 8/2/2023 |
| 0.7.1.29-preview | 350 | 8/1/2023 |
| 0.7.1 | 25,795 | 8/3/2023 |
| 0.7.0.28-preview | 289 | 7/28/2023 |
| 0.7.0.27-preview | 380 | 7/28/2023 |
| 0.7.0.26-preview | 380 | 7/27/2023 |
| 0.7.0.23-preview | 369 | 7/27/2023 |
| 0.7.0.22-preview | 396 | 7/27/2023 |
| 0.7.0.21-preview | 345 | 7/27/2023 |
| 0.7.0.20-preview | 385 | 7/27/2023 |
| 0.7.0 | 25,535 | 7/31/2023 |
| 0.6.3 | 26,294 | 7/22/2023 |
| 0.6.2 | 40,835 | 6/22/2023 |
| 0.6.1 | 25,416 | 6/20/2023 |
| 0.6.0 | 25,828 | 6/15/2023 |
| 0.5.30 | 25,625 | 6/12/2023 |
| 0.5.29 | 25,265 | 6/12/2023 |
| 0.5.28 | 25,277 | 6/10/2023 |
| 0.5.27 | 25,344 | 5/24/2023 |
| 0.5.26 | 25,404 | 5/11/2023 |
| 0.5.25 | 25,323 | 5/10/2023 |
| 0.5.3 | 25,313 | 5/5/2023 |
| 0.5.2 | 25,269 | 5/2/2023 |
| 0.5.1 | 25,275 | 5/2/2023 |
| 0.5.0 | 25,335 | 4/28/2023 |
| 0.4.2 | 25,359 | 4/24/2023 |
| 0.4.1 | 25,551 | 4/3/2023 |
| 0.4.0 | 25,437 | 3/24/2023 |
| 0.3.17 | 39,554 | 3/24/2023 |
| 0.3.16 | 25,350 | 3/22/2023 |
| 0.3.4 | 25,336 | 3/22/2023 |
| 0.3.3 | 25,431 | 3/17/2023 |
| 0.3.2 | 25,419 | 3/16/2023 |
| 0.3.1 | 25,372 | 3/14/2023 |
| 0.3.0 | 25,371 | 3/14/2023 |
| 0.2.4-alpha | 393 | 3/1/2023 |
| 0.2.3-alpha | 312 | 2/27/2023 |
| 0.2.2-alpha | 355 | 2/25/2023 |
| 0.2.1-alpha | 384 | 2/25/2023 |
| 0.2.0-alpha | 337 | 2/24/2023 |
| 0.1.5-alpha | 387 | 2/18/2023 |
| 0.1.4-alpha | 401 | 2/17/2023 |
| 0.1.3-alpha | 419 | 2/17/2023 |
| 0.1.2-alpha | 383 | 2/17/2023 |