Подтвердить что ты не робот

Несколько параметров в веб-api 2 получают

Я хочу сделать веб-api, которому передано 4 параметра.

Вот мой маршрут:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{email}/{firstname}/{lastname}/{source}"
        );

Вот подпись метода

public string GetId(string email, string firstname, string lastname, string source)

Вот URL-адрес вызова

http://fakedomain.com/api/Contacts/[email protected]&firstname=joe&lastname=shmoe&source=123

Я получаю ошибку 404.

Если я установил каждый параметр в опцию в конфигурацию маршрута и настроил каждый аргумент со значением по умолчанию, он будет вызван. Однако каждый аргумент получает значение по умолчанию, а не переданное значение.

Я чувствую, что я рядом, что мне не хватает?

4b9b3361

Ответ 1

Убедитесь, что в файле WebApiConfig.cs установлен параметр маршрута api по умолчанию.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
        name: "ContactApi",
        routeTemplate: "api/{controller}/{email}/{firstname}/{lastname}/{source}"
        );
    }
}

http://fakedomain.com/api/Contacts/[email protected]&firstname=joe&lastname=shmoe&source=123

Примечание: я заменил fakedomain на localhost, и он работает... (localhost/api/Contacts/GetId? email = имя пользователя = имя и фамилия =

Ответ 2

Вам не нужна специальная запись маршрутизации для обработки нескольких параметров. Созданная вами запись маршрутизации будет искать следующий маршрут

/api/controller/[email protected]/Dan/FunnyLastName/TheCoffeeShop

но вы пытаетесь передать параметры, а не указывать маршрут.

с этой записью маршрутизации:

config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional, action = "DefaultAction" });

следующая конечная точка GET:

public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)
    {
      //code
    }

может быть нажата как:

 /api/controllername/?requestId=15&username=Dan

или

/api/controllername/?departmentName=SoftwareEngineering

или любую другую комбинацию параметров (или без параметров, поскольку они имеют значения по умолчанию)

Поскольку у вас есть действие "Именованное" (GetId) вместо действий по умолчанию (GET, POST, PUT..), это немного усложняет ситуацию, и вам придется разработать собственный маршрут для обработки имени действия, Следующее - это то, что я использую для имен пользовательских действий (в этом примере требуется id)

config.Routes.MapHttpRoute("ActionRoute", "api/{controller}/{action}/{id}");

Конечная точка должна явно принимать один параметр с именем "id"

  public HttpResponseMessage LockRequest(int id, bool markCompleted)
    {
        //code
    }

Эта конечная точка будет удалена по следующему маршруту:

/api/controllerName/LockRequest/id?markCompleted=true

Следуя спецификации RESTful, лучше избегать имен пользовательских действий, когда это возможно. Большую часть времени вы можете уйти с обычными HTTP-глаголами и просто использовать именованные действия для управления существующими элементами (следовательно, поэтому идентификатор требуется в моем примере). Для вашего кода у вас может быть только две конечные точки GET, одна из которых принимает определенный ID для получения элемента, который возвращает все элементы (включая идентификаторы) на основе "параметров поиска".

public HttpResponseMessage Get(int id)
public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)

Они оба будут обработаны записью маршрутизации по умолчанию.

Ответ 3

public class Parameters
    {
        public int Param1 { get; set; }
        public string Param2 { get; set; }
    }

а затем в вашем методе контроллера:

    [ActionName("DoSomething")]
    [HttpPost]
    public IHttpActionResult DoSomething(Parameters myParameters)
    {
        var x = myParameters.Param1;
        var y = myParameters.Param1;
       //do something else..

    }

И постройте такой вызов ajax, как это:

var request = {
                    Param1 : "1",
                    Param2 : "Mystring"
                };

    function callToMethodController(request) {
        var deferred = $q.defer();
        $http.post('api/object/DoSomething', request)
            .success(function (data) {
                deferred.resolve(data);
            }).error(function (error) {
                deferred.reject('There was an error.');
            });
        return deferred.promise;
    }