RESTful API控制器/路由问题

时间:2016-04-16 15:29:07

标签: asp.net-mvc rest asp.net-web-api asp.net-web-api-routing

借助VS 2013,我创建了一个简单的MVC / Web Api应用程序。它有照片模型:

public class Photo
{
    public int Id{ get; set; }
    public string Name{ get; set; }
    public DateTime DateTimeOriginal { get; set; }
}

和一个PhotoController:

Photo[] photos = new Photo[] 
{ 
    new Photo { Id= 1, Name= "Mary B.",  DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:01:22 PM")}, 
    new Photo { Id = 2, Name= "Martin M.",  DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:13:09 PM" )}, 
    new Photo { Id = 3, Name= "Sparky",  DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:31:22 PM")} 
};


public IEnumerable<Photo> GetAllPhotos()
{
    return photos;
}

public IHttpActionResult GetPhoto(int id)
{
    var photo = photos.FirstOrDefault((p) => p.Id == id);
    if (photo == null)
    {
        return NotFound();
    }
    return Ok(photo);
}

public IHttpActionResult GetPhoto(string Name)
{
    var photo = photos.FirstOrDefault((p) => p.Name== Name);
    if (photo == null)
    {
        return NotFound();
    }
}

//I added this to see if this helps with the routing. It didn't
public IHttpActionResult GetName(string Name)
{
    var photo = photos.FirstOrDefault((p) => p.Name== Name);
    if (photo == null)
    {
        return NotFound();
    }
    return Ok(photo);

}

这个编译,我可以发出这样的网页请求:

http://localhost:59628/api/photos

我会找回一系列照片元素。

我可以发出这样的网络请求:

http://localhost:59628/api/photos/2

我会找回ID = 2的元素

但是

http://localhost:59628/api/photos/"Mary B" 

Name="Mary B" 

/GET/Name/Mary B 

/api/photos/name/Mary B 

它会返回错误。

所以我的第一个问题是为什么?如何按名称查询照片服务?

第二个问题:我在路由配置中看到了这些信息,但即使我将其添加到PhotosController:

[Route("photos/{photo}/Name")]
[HttpGet]
public IHttpActionResult GetName(string Name)
{
    var photo = photos.FirstOrDefault((p) => p.Name== Name);
    if (photo == null)
    {
        return NotFound();
    }
    return Ok(photo);
}

我找回了404.为什么?

1 个答案:

答案 0 :(得分:1)

配置路由,以便api知道如何处理资源请求。

当api无法根据配置找到请求的资源时,将返回

404 Not Found

如果计划使用属性路由,请确保在WebApiConfig.cs文件中配置它,如

// Attribute routing.
config.MapHttpAttributeRoutes();

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

对于属性路由,PhotosController将需要更新

[RoutePrefix("api/photos")]
public class PhotosController : ApiController {

    Photo[] photos = new Photo[] 
    { 
        new Photo { Id= 1, Name= "Mary B",  DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:01:22 PM")}, 
        new Photo { Id = 2, Name= "Martin M",  DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:13:09 PM" )}, 
        new Photo { Id = 3, Name= "Sparky",  DateTimeOriginal = Convert.ToDateTime("May 18, 2015 2:31:22 PM")} 
    };

    //GET api/photos
    [HttpGet]
    [Route("")]
    public IEnumerable<Photo> GetAllPhotos() {
        return photos;
    }

    //GET api/photos/5
    [HttpGet]
    [Route("{id:int}")]
    public IHttpActionResult GetPhoto(int id) {
        var photo = photos.FirstOrDefault((p) => p.Id == id);
        if (photo == null) {
            return NotFound();
        }
        return Ok(photo);
    }

    //GET api/photos/name/Mary B
    [HttpGet]
    [Route("name/{name}")]
    public IHttpActionResult GetPhotoByName(string name) {
        var photo = photos.FirstOrDefault((p) => p.Name == name);
        if (photo == null) {
            return NotFound();
        }
        return Ok(photo);
    }
}
相关问题