This tutorial shows how to call a web API from a .NET application, using System.Net.Http.HttpClient. The client-program can be found on Github, as well as the server-side code.
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace HttpClientSample
{
/// <summary>
/// HttpClientExtensions for Dotnet Core
/// see: https://stackoverflow.com/questions/40027299/where-is-postasjsonasync-method-in-asp-net-core
/// </summary>
public static class HttpClientExtensions
{
public static Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient httpClient, string url, T data)
{
var dataAsString = JsonConvert.SerializeObject(data);
var content = new StringContent(dataAsString);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return httpClient.PostAsync(url, content);
}
public static Task<HttpResponseMessage> PutAsJsonAsync<T>(this HttpClient httpClient, string url, T data)
{
var dataAsString = JsonConvert.SerializeObject(data);
var content = new StringContent(dataAsString);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return httpClient.PutAsync(url, content);
}
public static async Task<T> ReadAsJsonAsync<T>(this HttpContent content)
{
var dataAsString = await content.ReadAsStringAsync().ConfigureAwait(false);
return JsonConvert.DeserializeObject<T>(dataAsString);
}
}
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}
internal static class Program
{
private static readonly HttpClient _client = new HttpClient();
private static void ShowProduct(Product product)
{
Console.WriteLine($"Name: {product.Name}\tPrice: {product.Price}\tCategory: {product.Category}");
}
private static async Task<Uri> CreateProductAsync(Product product)
{
var response = await _client.PostAsJsonAsync("api/products", product);
response.EnsureSuccessStatusCode();
// return URI of the created resource.
return response.Headers.Location;
}
private static async Task<Product> GetProductAsync(string path)
{
Product product = null;
var response = await _client.GetAsync(path);
if (response.IsSuccessStatusCode)
{
product = await response.Content.ReadAsJsonAsync<Product>();
}
return product;
}
private static async Task<Product> UpdateProductAsync(Product product)
{
var response = await _client.PutAsJsonAsync($"api/products/{product.Id}", product);
response.EnsureSuccessStatusCode();
// Deserialize the updated product from the response body.
product = await response.Content.ReadAsJsonAsync<Product>();
return product;
}
private static async Task<HttpStatusCode> DeleteProductAsync(string id)
{
var response = await _client.DeleteAsync($"api/products/{id}");
return response.StatusCode;
}
private static void Main()
{
RunAsync().GetAwaiter().GetResult();
}
private static async Task RunAsync()
{
// Update port # in the following line.
_client.BaseAddress = new Uri("http://localhost:64195/");
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
// Create a new product
var product = new Product
{
Name = "Gizmo",
Price = 100,
Category = "Widgets"
};
var url = await CreateProductAsync(product);
Console.WriteLine($"Created at {url}");
// Get the product
product = await GetProductAsync(url.PathAndQuery);
ShowProduct(product);
// Update the product
Console.WriteLine("Updating price...");
product.Price = 80;
await UpdateProductAsync(product);
// Get the updated product
product = await GetProductAsync(url.PathAndQuery);
ShowProduct(product);
// Delete the product
var statusCode = await DeleteProductAsync(product.Id);
Console.WriteLine($"Deleted (HTTP Status = {(int) statusCode})");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadLine();
}
}
}