Làm cách nào để tạo Url Web API ASP.NET?


120

Trong ASP.NET MVC, chúng ta có @Url.Actioncác hành động. Có cái gì đó tương tự như @Url.Apivậy sẽ định tuyến đến / api / controller không?

Câu trả lời:


139

Các ApiController có một tài sản gọi là Url đó là loại System.Web.Http.Routing.UrlHelper cho phép bạn xây dựng các url cho bộ điều khiển api.

Thí dụ:

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        // returns /api/values/123
        string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
        return new string[] { "value1", "value2" };
    }

    // GET /api/values/5
    public string Get(int id)
    {
        return "value";
    }

    ...
}

UrlHelper này không tồn tại trong chế độ xem của bạn cũng như trong bộ điều khiển tiêu chuẩn.


CẬP NHẬT:

Và để thực hiện định tuyến bên ngoài ApiController, bạn có thể làm như sau:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

hoặc bên trong một chế độ xem:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

Lưu ý httproute = ""mã thông báo tuyến đường là quan trọng.

Rõ ràng điều này giả định rằng tuyến đường Api của bạn được gọi DefaultApitrong phương thức RegisterRoutes của bạn trong Global.asax:

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

Điều đó .. thực sự không giúp tôi nhiều vì tôi cần Chế độ xem của mình để có thể tạo Url theo cách an toàn. Nếu có giấy phép Go Live thì cách 'Go Live' để tạo url trên Chế độ xem là gì?
Shane Courtrille,

Quan trọng hơn, điều này sẽ không hoạt động nếu bạn đang sử dụng Máy chủ phát triển ASP.Net vì nó thay đổi các cổng liên tục nên bạn thậm chí không thể chỉnh sửa url trong chế độ xem.
Shane Courtrille

@ShaneCourtrille, tôi đã cập nhật câu trả lời của mình để minh họa cách bạn có thể sử dụng thông thường System.Web.Mvc.UrlHelperđể tạo các tuyến Api bên ngoài HttpControllerContext.
Darin Dimitrov

Cảm ơn rất nhiều! Tôi đang cố gắng sử dụng RouteUrl nhưng không biết về yêu cầu của tham số httproute.
Shane Courtrille

2
Tôi hiểu mục đích của mẫu; Tôi nói rằng nó sẽ là một mẫu hữu ích hơn nếu bạn ném vào một dòng mã ViewBag vì bạn sẽ chứng minh rằng giá trị này là giá trị mà chúng tôi đang cố gắng đạt được trong một tình huống có thể xảy ra chứ không chỉ thực thi một số mã tùy ý. Một lần nữa, tôi sẽ không nhận xét nếu tôi đã không lãng phí vài phút để không nhận ra những gì tôi đã bỏ lỡ trước khi cuối cùng tôi nhận ra rằng dòng mã cụ thể là dòng mã có liên quan.
Jon Davis

43

Nó hoạt động với dạng đơn giản hơn, Url.Actiondo đó bạn không phải tham chiếu đến bất kỳ tên Định tuyến nào:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

Bạn có thể muốn thêm một area = ""nếu URL cần thiết trong một Khu vực. (Bộ điều khiển Api nằm ngoài Khu vực theo mặc định.) Tôi đang sử dụng MVC 4.


7
UrlHelper trong Web Api là msdn.microsoft.com/en-us/library/… , nó không có phương thức hành động.
Yuriy Faktorovich,

8
@YuriyFaktorovich Bài đăng này ngụ ý rằng nó Url.Actionđang được sử dụng từ Chế độ xem. Urllà loại System.Web.Mvc.UrlHelpervà nó không ánh xạ đến WebApicác tuyến đường. Đây là lý do tại sao bạn cần tham số phụ: new { httproute = "" }.
Jesse

3
Tôi đã thêm httproute""nhưng nó không phải là ánh xạ = /
Maslow

Tôi đã phải thêm liên kết với một vùng trống và htmlAttributes rỗng @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) nhưng điều đó hoạt động hoàn hảo
Christopher G. Lewis

2
Điều này hoạt động hoàn hảo từ một chế độ xem, tuy nhiên, tôi không chắc tại sao nó lại tạo tên của hành động dưới dạng một chuỗi truy vấn như: / api / dashboard? Action = getdata. Tôi đã chờ đợi này: / api / bảng điều khiển / getdata
umutesen

7

Bạn muốn có thể tạo liên kết theo cách an toàn, không có chuỗi mã cứng (tên bộ điều khiển)?

Có một điều đó! (và nó được viết bởi Mark Seeman)

https://github.com/ploeh/Hyprlinkr

Hoạt động như thế này:

Các tuyến đường, như thường lệ:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

Nhận một URL:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

Kết quả:

http://localhost/api/foo/1337

3

Đây là phương pháp KISS để trả lời câu hỏi:

Nếu đây là mã mà bạn sẽ sử dụng để tạo URL bộ điều khiển MVC

@Url.Action("Edit", "MyController")

Để lấy URL cho phiên bản API của bộ điều khiển (giả sử bạn sử dụng cùng tên bộ điều khiển), bạn có thể sử dụng

@Url.Action("Edit", "api/MyController")

Tất cả những gì mà phương thức Url.Action đang làm là nối thêm đường dẫn gốc của ứng dụng, với tên bộ điều khiển, theo sau là tên hành động (trừ khi nó là "Chỉ mục", trong trường hợp đó nó không được nối nếu đối tượng giá trị định tuyến có id thuộc tính giá trị cũng được thêm vào URL.


Cảm ơn bạn! Tôi đã thiếu api/trước tên bộ điều khiển của tôi.
Daniel Congrove
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.