使用WEB API HttpClient使用外部API然后以角度显示反序列化结果是否可以接受?

时间:2018-04-25 12:11:34

标签: c# asp.net-mvc angular asp.net-web-api asp.net-core-mvc

我需要检索JSON Feed的内容。我想使用HttpClient下载内容。为此,我创建了一个带有Get方法的WEB API控制器,该方法使用HttpClient的外部API,然后返回List反序列化的内容:

using (HttpClient client = new HttpClient())
{
    client.BaseAddress = new Uri("externalAPI");
    MediaTypeWithQualityHeaderValue contentType =
                new MediaTypeWithQualityHeaderValue("application/json");
    client.DefaultRequestHeaders.Accept.Add(contentType);
    HttpResponseMessage response = await client.GetAsync(client.BaseAddress);
    string content = await response.Content.ReadAsStringAsync();
    List<MyClass> data = JsonConvert.DeserializeObject<List<MyClass>>(content);
    return data;
}

现在我将使用Angular在客户端显示此列表,我知道如何执行这些步骤,但我的问题是为什么我应该使用WEB API来使用另一个外部API,因为我可以简单地使用Angular {{ 1}}使用那个外部API?是否正在使用此WEB API来使用外部API,然后将HttpClient返回给Angular,将其视为最佳做法?如果不是,最好的方法是什么,如果我必须为此目的使用MVC

3 个答案:

答案 0 :(得分:2)

在我的项目中,我通过webapi消耗了外部API(它返回了json数据)。

我这样做是因为我的Angular项目只需要保持对webapi的引用,即只保留一个url。我的项目中的另一个案例是Dev,UAT和prod环境中的外部api url更改,所以我不想在我的角度项目中维护。

所以我这样做有两个原因

  1. 不想保留外部api的引用(即外部api的URL),我只获得一个联系人来获取我项目中的数据,这是我的webapi
  2. Dev,UAT和PRod中外部API更改的URL,因此我不想在Angular项目中维护该信息。
  3. 这使我的角度代码更易于维护,好像其他人看起来我的代码他/她得到的信息是webapi只是他们应该寻找的位置,数据来自哪里
  4. 想象一下您从多个外部API获取数据的情况,在这种情况下,您必须保持对Angualr项目中所有API的引用。所以最好遵循 FACADE设计模式,并且只保留一个点(在这种情况下是哪个WebAPI)与所有外部api连接并返回数据。

    为了每10分钟获取一次数据,您需要使用RxJs

    var timer$ = Rx.Observable.interval(1000) // 1000 = 1 second
    
    timer$
      .subscribe((v)=> this.Service.CalltoExtnerlAPIToGetdata()
                 .subscribe(data=> this.values = data));
    

    如果您不打算使用它以避免内存泄漏,请取消订阅Rxjs Timer。http://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables

答案 1 :(得分:1)

我们假设此外部API位于域abc.com中,您的应用位于yourapp.com。如果abc.com不允许CORS(跨源请求),您将无法从yourapp.com中运行的角度应用程序中检索数据,因此构建了一个&#34;中间件&#34 ;在服务器中可能会解决这个问题。

无论如何,构建此中间件并非强制要求。如果目标API允许CORS,则无需执行此操作,您可以在角度应用程序中编写请求数据的图层。

答案 2 :(得分:1)

主要原因在于same origin policy范围内的特定来源,例如浏览器执行的脚本只允许对同一域(模式,主机和端口)中的源执行请求。 原因主要与安全有关,并在this StackExchange question中进行了广泛讨论。

MVC实现中遵循此策略的典型方法是使用服务器端代码(即使用HttpClient的Controller)对WebAPI执行HTTP请求。然后,View中的Javascript只会调用Controller的方法来检索结果。

作为旁注,这种方法还有一个好处,让您可以在将数据呈现给View之前处理Controller中的任何序列化工作。