繁体   English   中英

从MVC控制器调用远程Web API

[英]Calling remote web api from mvc controller

处理每个控制器的Web api端点的首选方法是什么? 例如,我的MVC控制器将调用不同的端点。 这些是目前唯一的,但是可能会改变。

另外,我将在本地进行开发并将其部署到开发服务器。

http:// localhost:42769 / api / categories / 1 / products

http:// localhost:42769 / api / products /

public class ProductsController : Controller
{
    HttpClient client;
    string url = "http://localhost:42769/api/categories/1/products"; //api/categories/{categoryId}/products

    public ProductsController()
    {
        client = new HttpClient();
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }


    // GET: Products
    public async Task<ActionResult> ProductsByCategory()
    {
        HttpResponseMessage responseMessage = await client.GetAsync(url);
        if (responseMessage.IsSuccessStatusCode)
        {
            var responseData = responseMessage.Content.ReadAsStringAsync().Result;
            var products = JsonConvert.DeserializeObject<List<GetProductsByCategoryID>>(responseData);
            return PartialView(products);
        }

        return View("Error");
    }
}

不确定我是否理解您的问题,但是我会为服务创建包装类,然后为需要调用的每种资源使用不同的方法。 始终认为SOLID

示例 (手写)

public class Client
{
    private Uri baseAddress;

    public Client(Uri baseAddress)
    {
        this.baseAddress = baseAddress;
    }

    public IEnumerable<Products> GetProductsFromCategory(int categoryId)
    {
         return Get<IEnumerable<Product>>($"api/categories/{categoryId}/products");
    }

    public IEnumerable<Products> GetAllProducts()
    {
         return Get<IEnumerable<Product>>($"api/products");
    }

    private T Get<T>(string query)
    {
        using(var httpClient = new HttpClient())
        {
             httpClient.BaseAddress = baseAddress;

             var response= httpClient.Get(query).Result;
             return response.Content.ReadAsAsync<T>().Result;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM