在Web API 2的GET请求中使用多个参数

22

我想制作一个Web 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/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123

我遇到了404错误。

如果我在路由配置中将每个参数设置为可选,并为每个参数设置默认值,它会被调用。然而,每个参数都会得到默认值而不是传递的值。

我觉得我已经接近成功了,但是我还缺少什么?

3个回答

33

处理多个参数无需特殊路由记录。您创建的路由记录将寻找以下路由:

/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
或任何其他参数组合(或没有参数,因为它们具有默认值)
由于您有一个“命名”操作(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)

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


我认为这是一个更好的答案。细节很好。谢谢分享。 - Behr
太棒了!非常感谢你让我的代码整洁有序! - Coder Absolute

8

请确保在 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

注意:我已将fakedomain替换为localhost,这样就可以正常工作了...(localhost/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123)

我用contactapi替换了默认的api。当我重新添加回defaulapi时,它起作用了。谢谢。 - Nick

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

使用POST存在安全问题。 - Elvin Mammadov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接