Wystarczy znaleźć projekt o nazwie: ProxyApi
ProxyApi to biblioteka, która automatycznie tworzy proxy obsługa JavaScript obiektów dla ASP.NET MVC i kontrolerów WebAPI.
GitHub: https://github.com/stevegreatrex/ProxyApi
Blog: http://blog.greatrexpectations.com/2012/11/06/proxyapi-automatic-javascript-proxies-for-webapi-and-mvc/
ProxyApi generowane nieprawidłowy JavaScript na moim roztwór, który zawierał ponad sto odrębnych działań WebAPI. Jest tak prawdopodobnie dlatego, że ProxyApi nie obejmuje wszystkich funkcji WebApi, takich jak niestandardowe atrybuty ActionName. Co więcej, biblioteka ProxyApi znajduje się nieco na mojej wielkiej stronie. Musi być na to skuteczniejszy sposób ...
Postanowiłem więc rzucić okiem na kod źródłowy ASP.NET WebAPI i okazało się, że WebAPI ma wbudowaną samoopisującą się funkcjonalność. Możesz użyć następującego kodu z dowolnego miejsca w ASP.Rozwiązanie NET dostęp do metadanych WebAPI:
var apiExplorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
oparciu o wyjściu z apiExplorer.ApiDescriptions
, przewróciłam własnego dostawcę Metadane:
public class MetadataController : Controller
{
public virtual PartialViewResult WebApiDescription()
{
var apiExplorer = GlobalConfiguration.Configuration.Services.GetApiExplorer();
var apiMethods = apiExplorer.ApiDescriptions.Select(ad => new ApiMethodModel(ad)).ToList();
return PartialView(apiMethods);
}
public class ApiMethodModel
{
public string Method { get; set; }
public string Url { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
public IEnumerable<ApiParameterModel> Parameters { get; set; }
public ApiMethodModel(ApiDescription apiDescription)
{
Method = apiDescription.HttpMethod.Method;
Url = apiDescription.RelativePath;
ControllerName = apiDescription.ActionDescriptor.ControllerDescriptor.ControllerName;
ActionName = apiDescription.ActionDescriptor.ActionName;
Parameters = apiDescription.ParameterDescriptions.Select(pd => new ApiParameterModel(pd));
}
}
public class ApiParameterModel
{
public string Name { get; set; }
public bool IsUriParameter { get; set; }
public ApiParameterModel(ApiParameterDescription apiParameterDescription)
{
Name = apiParameterDescription.Name;
IsUriParameter = apiParameterDescription.Source == ApiParameterSource.FromUri;
}
}
}
Używaj tego kontrolera w połączeniu z następującym zdaniem:
@model IEnumerable<Awesome.Controllers.MetadataController.ApiMethodModel>
<script type="text/javascript">
var awesome = awesome || {};
awesome.api = {
metadata: @Html.Raw(Json.Encode(Model))
};
$.each(awesome.api.metadata, function (i, action) {
if (!awesome.api[action.ControllerName]) {
awesome.api[action.ControllerName] = {};
}
awesome.api[action.ControllerName][action.ActionName] = function (parameters) {
var url = '/' + action.Url;
var data;
$.each(action.Parameters, function (j, parameter) {
if (parameters[parameter.Name] === undefined) {
console.log('Missing parameter: ' + parameter.Name + ' for API: ' + action.ControllerName + '/' + action.ActionName);
} else if (parameter.IsUriParameter) {
url = url.replace("{" + parameter.Name + "}", parameters[parameter.Name]);
} else if (data === undefined) {
data = parameters[parameter.Name];
} else {
console.log('Detected multiple body-parameters for API: ' + action.ControllerName + '/' + action.ActionName);
}
});
return $.ajax({
type: action.Method,
url: url,
data: data,
contentType: 'application/json'
});
};
});
</script>
Sterownik użyje ApiExplorer
do generowania metadanych o wszystkich dostępnych operacjach WebAPI. Widok wyrenderuje te dane jako JSON, a następnie uruchomi JavaScript, aby przekształcić te dane w rzeczywiste wykonywalne funkcje JavaScript.
Aby użyć tej odrobiny magii, wstaw następującą linię w nagłówku strony Układ, aby uzyskać odniesienie do jQuery.
@Html.Action(MVC.Metadata.WebApiDescription())
Od tej chwili można dokonać połączenia WebAPI wyglądać następująco:
// GET: /Api/Notes?id={id}
awesome.api.Notes.Get({ id: id }).done(function() {
// .. do something cool
});
// POST: /Api/Notes
awesome.api.Notes.Post({ form: formData }).done(function() {
// .. do something cool
});
Ten prosty proxy automatycznie odróżnić parametry ciągu kwerendy z parametrami prośba ciała. Brakujące parametry lub wiele parametrów ciała wygeneruje błąd, aby zapobiec literom lub innym typowym błędom programowania WebAPI.
Jak odzyskać Lista stosując metodę dostać? Wygląda na to, że zawsze oczekuje parametru ID –
Awsome przy okazji! –
Zorientowałem się, właśnie dodałem 'if (parametry typeof! = 'Undefined' && parametry!= null) {' instrukcja dotycząca bloku sprawdzania parametrów i dodana ' url = url.replace ("" {"" + parameter.Name + ""} "", "');' w innej części –