学海无涯

导航

Razor客户端调用API

在 appsetting.json 中配置基础连接 Url

  "backendUrl": "https://localhost:5901"

  封装客户端访问类

using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

namespace frontend
{
   public class PizzaClient
   {
      private readonly JsonSerializerOptions options = new JsonSerializerOptions()
      {
         PropertyNameCaseInsensitive = true,
         PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
      };

      private readonly HttpClient client;
      private readonly ILogger<PizzaClient> _logger;

      public PizzaClient(HttpClient client, ILogger<PizzaClient> logger)
      {
         this.client = client;
         this._logger = logger;
      }

      public async Task<PizzaInfo[]> GetPizzasAsync()
      {
         try {
            var responseMessage = await this.client.GetAsync("/pizzainfo");
            
            if(responseMessage!=null)
            {
               var stream = await responseMessage.Content.ReadAsStreamAsync();
               return await JsonSerializer.DeserializeAsync<PizzaInfo[]>(stream, options);
            }
         }
         catch(HttpRequestException ex)
         {
            _logger.LogError(ex.Message);
            throw;
         }
         return new PizzaInfo[] {};

      }
   }
}

  注册服务类 PizzaClient ,并设置基础 Url 地址

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();

            services.AddHttpClient<PizzaClient>(client => 
            {
                var baseAddress = new Uri(Configuration.GetValue<string>("backendUrl"));

                client.BaseAddress = baseAddress;
            });

        }

  UI消费

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace frontend.Pages
{
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;
        public PizzaInfo[] Pizzas { get; set; }

        public string ErrorMessage {get;set;}
        
        public IndexModel(ILogger<IndexModel> logger)
        {
            _logger = logger;
        }

        public async Task OnGet([FromServices]PizzaClient client)
        {
            Pizzas = await client.GetPizzasAsync();
            
            if(Pizzas.Count()==0)
                ErrorMessage="We must be sold out. Try again tomorrow.";
            else
                ErrorMessage = string.Empty;
        }
    }
}

  

posted on 2022-09-22 09:02  宁静致远.  阅读(74)  评论(0编辑  收藏  举报