【问题标题】:Maintaining WebAPI endpoints in JavaScript在 JavaScript 中维护 WebAPI 端点
【发布时间】:2016-03-21 13:50:15
【问题描述】:

我想知道是否有任何好的技术可以让您的 WebAPI 控制器路由与客户端保持同步。

例如,您有一个 WebAPI 控制器 BooksController。在客户端,您可以通过调用端点来调用方法:

$.get('books/1');

然后有一天你决定重命名控制器,或者添加一个 RoutePrefix。这会破坏客户端代码,因为端点已更改。

我遇到了图书馆WebApiProxy,看起来很有趣。有没有人有解决这个问题的好方法?是否有理由在我可能忽略的客户端上使用字符串文字?

【问题讨论】:

  • 你在客户端使用什么库?
  • 香草JS。有没有图书馆可以让这个更干净?
  • 嗯,我认为使用一些根据 Web API 实现生成一些 js 代理的魔术库不是很好,从我的角度来看,最好控制正在发生的事情。也就是说,我的建议是在客户端也有路由配置,比如使用requirejs,你可以调用require.toUrl('books/1'),根据requirejs配置此网址可以替换为实际网址,例如“localhost/mywebaby/books/1”。如果 Web API 发生变化,您可以更改客户端配置。
  • 我从未见过 require.toUrl 语法,你有参考链接吗?
  • 这里是文档requirejs.org/docs/api.html#modulenotes-urlsrequirejs.org/docs/api.html#config-map,但是你可以使用任何其他库,或者自己做 - 使用一些会告诉你真实地址的函数,输入参数到这个函数将是您在 javascript 中使用的路由,并在此方法中(例如使用正则表达式)创建真正的 url

标签: javascript asp.net-web-api asp.net-web-api2


【解决方案1】:

我创建了一个关于该主题的博文。看看:)

http://blog.walden.dk/post/2017/02/02/export-all-your-asp-net-webapi-endpoints-to-json

我正在写一篇在 javascript 中使用它的帖子。无论如何,此代码会导出端点运行时,并将用于重构和路由更改。它还导出 uri 参数,它们可用于在 javascript 中解析并替换为来自客户端的值。

实现你想要的最简单的方法是使用 ASP.NET WEBAPI 中内置的 ApiExplorer。它搜索所有“ApiController”实现,并读取路由属性元数据。

public class EndpointManager
{
    public IEnumerable<ApiMethodModel> Export()
    {
        //Use the build-in apiexplorer to find webapi endpoints
        IApiExplorer apiExplorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
        //exclude endpoints without the attribute
        var apiMethods = apiExplorer.ApiDescriptions.Select(ad => new ApiMethodModel(ad)).ToList();
        return apiMethods;
    }
}

您可以创建一个端点来返回生成的数据。

[RoutePrefix("api/endpoint")]
public class EndpointApiController : ApiController {
 [HttpGet]
    [Route("all")]
    public IEnumerable<ApiMethodModel> All()
    {
        var endpoints = new EndpointManager().Export();
        return endpoints;
    }
}

现在可以在“/api/endpoint/all”到达所有端点

【讨论】:

    【解决方案2】:

    这是我在对您的问题的评论中谈到的一个示例:

    function getUrl(uri) {
      var bookRoute = /books(.*?)/i;
      var otherRoute = /something(.*?)/i;
      
      if(uri.match(bookRoute)) {
        return uri.replace(bookRoute, "http://localhost/webapi/books$1")
      }
      
      if(uri.match(otherRoute)) {
        return uri.replace(otherRoute, "http://mydomain/api/something$1")
      }
      
      return uri;
    }
    
    alert(getUrl("books/1"));
    alert(getUrl("something/realy/different/1"));

    您只需要在函数体中定义路由即可。

    【讨论】:

    • 我猜你仍然需要在 JavaScript 中硬编码可用的路由。我希望避免将字符串文字放入 JavaScript 并使用其他机制创建端点。
    • 您可以停止将其视为硬编码的字符串文字,而开始将其视为客户端应用程序的配置。您将更好地控制它是如何工作的,而不是使用一些最终会做同样事情的魔术库,读取您的服务器 api 路由并生成一些 javascript 代理。这就是我的观点。
    • 我明白你的意思。如果您更改控制器的名称,则无法解决问题,您强迫自己执行 Find In All Files 操作以查找使用该路由配置的所有实例。我知道您可以将所有内容放在一个位置,但为什么不更进一步让服务器生成它。我的意思是它通过路由表知道路由,我不明白为什么它不能将它发送给客户端。
    • Find in All files 真的没必要,我建议把它放在一个地方,那个地方是唯一需要改变的地方。正如您所说,您似乎希望您的路线会经常改变,如果是这样,那么您应该重新考虑一下,因为,为什么路线甚至应该改变?他们多久会改变一次?自 ASP.NET ScriptManager 以来,神奇的 javascript 代理生成就一直存在,它去了哪里?
    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多