2016-03-21 4 views
0

Мне было интересно, есть ли какие-либо хорошие методы для поддержания маршрутов контроллера WebAPI в синхронизации с клиентской стороной.Поддержание конечных точек WebAPI в JavaScript

Например, у вас есть контроллер BookPontroller контроллера WebAPI. На клиенте вы можете вызвать метод, с помощью вызова конечной точки:

$.get('books/1'); 

Тогда один прекрасный день вы решили переименовать контроллер, или добавить RoutePrefix. Это нарушает код на стороне клиента, поскольку конечная точка изменилась.

Я наткнулся на библиотеку WebApiProxy, которая выглядит интересной. Кто-нибудь имеет хороший подход к решению этой проблемы? Есть ли причина использовать строковые литералы на клиенте, которые я могу игнорировать?

+0

Какие библиотеки вы используете на стороне клиента? – xxxmatko

+0

Vanilla JS. Есть ли библиотека, которая делает это чище? – cgatian

+0

Хм, я думаю, что использование некоторой магической библиотеки, которая генерирует некоторые прокси-серверы js в соответствии с реализацией веб-API, не очень хороша, сформируйте мою точку зрения, лучше иметь контроль над тем, что происходит. Другими словами, мое предложение состоит в том, чтобы настроить маршрут на стороне клиента, например, с помощью requirejs, вы можете вызывать ** require.toUrl ('books/1') **, и в соответствии с требованием js-конфигурации этот URL-адрес может заменен на фактический, например, «http: // localhost/mywebaby/books/1». При изменении веб-API вы можете изменить конфигурацию на стороне клиента. – xxxmatko

ответ

0

Вот пример я говорил в моем комментарии к вашему вопросу:

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"));

Все, что вам нужно, чтобы определить маршруты в теле вашей функции.

+0

Думаю, вам все равно нужно жестко кодировать доступные маршруты в JavaScript.Я стараюсь избегать помещать строковые литералы в JavaScript и создать какой-то другой механизм для создания конечных точек. – cgatian

+0

Вы можете перестать смотреть на него в виде строковых литералов и начать рассматривать его как конфигурацию для своего клиентского приложения. У вас будет лучший контроль над тем, как все работает, а не с помощью какой-либо магической библиотеки, которая в конце концов сделает то же самое, прочитает маршруты сервера api и сгенерирует некоторые прокси-серверы javascript. Это моя точка зрения. – xxxmatko

+0

Я получаю вашу мысль. Он не решает проблему, если вы меняете имя контроллера, заставляющего себя выполнять операцию «Найти во всех файлах», ища все экземпляры, используя эту конфигурацию маршрута. Я понимаю, вы можете поместить все это в одном месте, но почему бы не пойти дальше и не создаст сервер. Я имею в виду, что он знает маршруты по таблице маршрутов, я не понимаю, почему он не может передать это клиенту. – cgatian

1

Я создал блог bost на тему. Посмотрите :)

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

Im работая на посту, потребляющего его в JavaScript .. Во всяком случае, этот код экспортирует выполнения конечных точек, и будет работать на рефакторинга и изменения маршрута. Он также экспортирует параметры uri, их можно использовать для анализа в javascript и замены значений с клиента.

Простейший способ добиться того, что вы хотите, - использовать встроенный ApiExplorer в ASP.NET WEBAPI. Он выполняет поиск всех реализаций «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; 
    } 
} 

Теперь все конечные точки могут быть достигнуты на «/ апи/конечная точка/все»

Смежные вопросы