在现代Web开发中,与API进行交互是一个常见的需求。无论是调用公共API还是内部API,经常需要发送数据。本文将介绍如何在C#中使用HttpClient类来发送JSON数据到API。
HttpClient是.NET框架中用于发送HTTP请求的一个类。它支持同步和异步操作,使得与远程服务的交互变得简单。在本例中,将使用HttpClient来发送JSON编码的数据到一个API端点。
首先,需要创建一个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。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控制器中调用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 });
}
}