web api 2中有多个参数

时间:2014-08-06 13:26:48

标签: asp.net-web-api2

我想创建一个传递4个参数的web api。

这是我的路线:

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

这是方法签名

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

这是调用网址

http://fakedomain.com/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123

我收到404错误。

如果我在路由配置中将每个参数设置为可选,并使用默认值设置每个参数,则会调用它。但是,每个参数都获取默认值,而不是传递的值。

我觉得我很亲密,我错过了什么?

3 个答案:

答案 0 :(得分:32)

您不需要特殊的路由记录来处理多个参数。您创建的路由记录将查找以下路由

/api/controller/Dan@dan.com/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

或参数的任何其他组合(或没有参数,因为它们具有默认值)

因为你有一个名为"命名的" action(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谓词,只使用命名操作来操作现有项(因此在我的示例中需要ID)。对于您的代码,您可以只有两个GET端点,一个获取特定ID以获取项目,一个根据"搜索参数"返回所有项目(包括ID)。

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

这些都将由默认路由记录处理。

答案 1 :(得分:7)

确保您在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/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123

注意:我用localhost替换了fakedomain并且它有效...(localhost / api / Contacts / GetId?email=user@domain.com& firstname = joe& lastname = shmoe& source = 123)

答案 2 :(得分:0)

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;
    }