C#中HttpClient的使用:发送JSON数据到API

在现代Web开发中,与API进行交互是一个常见的需求。无论是调用公共API还是内部API,经常需要发送数据。本文将介绍如何在C#中使用HttpClient类来发送JSON数据到API

HttpClient简介

HttpClient是.NET框架中用于发送HTTP请求的一个类。它支持同步和异步操作,使得与远程服务的交互变得简单。在本例中,将使用HttpClient来发送JSON编码的数据到一个API端点。

创建ApiClient

首先,需要创建一个ApiClient类,它将封装HttpClient的使用。这个类将提供一个方法,用于发送JSON数据。

public interface IApiClient { Task<HttpResponseMessage> PostJsonEncodedContent<T>(string requestUri, T content) where T : ApiModel; } public class ApiClient : IApiClient { private readonly HttpClient httpClient; private const string BaseUri = "http://localhost:28601/"; public ApiClient(HttpClient httpClient) { this.httpClient = httpClient; } public async Task<HttpResponseMessage> PostJsonEncodedContent<T>(string requestUri, T content) where T : ApiModel { httpClient.BaseAddress = new Uri(BaseUri); httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await httpClient.PostAsJsonAsync(requestUri, content); return response; } }

在上面的代码中,定义了一个接口IApiClient和一个实现类ApiClient。ApiClient类使用HttpClient发送JSON数据。

调用ApiClient

接下来,需要调用ApiClient。PostAsJsonAsync是一个方便的扩展方法,它来自Microsoft.AspNet.WebApi.Client Nuget包。需要设置请求头以接受JSON。

public interface IProductClient { Task<CreateProductResponse> CreateProduct(ProductViewModel product); } public class ProductClient : ClientBase, IProductClient { private const string ProductsUri = "api/products"; public ProductClient(IApiClient apiClient) : base(apiClient) { } public async Task<CreateProductResponse> CreateProduct(ProductViewModel product) { var apiModel = new ProductApiModel { CreatedOn = DateTime.Now, Name = product.Name, Description = product.Description }; var createProductResponse = await PostEncodedContentWithSimpleResponse<CreateProductResponse, ProductApiModel>(ProductsUri, apiModel); return createProductResponse; } }

在ProductClient类中,定义了一个接口IProductClient和一个实现类ProductClient。ProductClient类使用ApiClient发送数据,并处理响应。

MVC控制器中的使用

最后,需要在MVC控制器中调用ProductClient。由于这是一个异步操作,需要确保控制器动作也是异步的。

public class ProductController : Controller { private readonly IProductClient productClient; public ProductController() { var apiClient = new ApiClient(); productClient = new ProductClient(apiClient); } public ProductController(IProductClient productClient) { this.productClient = productClient; } public ActionResult CreateProduct() { var model = new ProductViewModel(); return View(model); } [HttpPost] public async Task CreateProduct(ProductViewModel model) { var response = await productClient.CreateProduct(model); var productId = response.Data; return RedirectToAction("GetProduct", new { id = productId }); } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485