浏览器通过异步控制器进行的Ajax调用

问题描述:

我正在调用外部REST服务(Vimeo REST API)。服务的响应是JSON对象。我的应用程序中的单个视图最终可能会多次调用该服务(用于加载多个视频)。浏览器通过异步控制器进行的Ajax调用

我想衡量利弊使用jquery Ajax调用加载单个视频(调用从浏览器到REST服务进行的每部影片都有它的标识使用以下架构在这种情况下

  1. 的缺点这是使用ansynchronous控制器行动,使控制器的REST调用,然后显示vedios

注意了解详细内容)

  • 唯一的解药:我用简单的API服务不需要认证。

  • AsyncController不是为了异步服务HTTP请求而设计的,而是为了执行长时间运行的服务器端进程。向REST服务发出单个请求可能会或可能不是一个长时间运行的服务器端进程。

    因此,无论您是决定使REST请求服务器端还是直接从客户端(浏览器),您不一定需要使用AsyncController。正常的Controller可能会完成这项工作。

    您应该如何处理视频请求取决于业务层的结构。如果在业务层中有Vimeo视频处理的知识,那么最好的做法是让您的Web服务呼叫服务端。否则,您的客户端上会有业务逻辑,这会使维护变得困难。

    另一方面,如果您的Vimeo视频只是自包含的UI部件的一部分,那么可以安全地在客户端上完整处理请求,而不会产生意外的后果。

    我假设对Vimeo的Web服务调用收到一个Flash文件或类似的东西。这将需要更多的带宽以及花费更多的内存来从服务器进行Vimeo服务调用,因为这样数据必须发送到服务器。

    如果你做服务器端,出现这种情况:

    1 - Browser sends HTTP-Request to YourApplication 
    2 - YourApplication sends HTTP-Request to Vimeo's WebService 
    3 - Vimeo's WebService sends big HTTP Response with the Video data to YourApplication 
    4 - YourApplication sends big HTTP Response with the Video data to Browser 
    
    * If you choose to do it this way, this might be the point at which it makes sense to use an AsyncController 
    

    如果你这样做的客户端,出现这种情况:

    1 - Browser sends HTTP-Request to Vimeo's WebService 
    2 - Vimeo's WebService sends big HTTP Response with the Video data to the Browser 
    

    这使得它看起来像是在做这一切的客户端是更好。但那么就存在整个业务逻辑问题。这可以通过向同步控制器操作发送ajax请求来进行业务逻辑处理,并使其返回到REST服务的调用URL到浏览器来解决。所以:

    1 - Browser sends AJAX request to YourApplication 
    2 - YourApplication handles business logic and sends the URL of the REST request to Browser 
    3 - Browser sends AJAX request to Vimeo's WebService 
    4 - Vimeo's WebService sends big HTTP response with the video data to the browser. 
    

    我认为这可能是你最好的选择。

    您可能会遇到第一种方法的问题,因为跨域ajax调用(打开的页面来自yoursite.com域,并且您打电话给vimeo.com)被浏览器禁止。

    除了第二种方法,可以使用JSONP通过Vimeo的API提供:http://vimeo.com/api/docs/response-formats

    如果您对单一的操作方法的Vimeo的REST服务进行多次调用,这似乎是一个很好的候选人使用一个异步控制器。这有两个好处:它允许您并行执行对Vimeo服务的多个调用,并且它将释放正在处理请求的线程,并允许它在服务器等待Vimeo的响应时处理其他请求。

    我想这里的权衡会增加客户端代码或控制器代码的复杂性。在服务器端发出请求的另一个好处(无论是否异步执行)是,您可以缓存数据,并尽量减少将来处理请求所需的昂贵Web服务调用数量。这真的取决于缓存数据是否是一种可行的选择。