Bagaimana cara membuat Url API Web ASP.NET?

120

Di ASP.NET MVC, kami memiliki @Url.Actiontindakan. Apakah ada sesuatu yang serupa seperti @Url.Apiyang akan diarahkan ke / api / controller?

Shane Courtrille
sumber

Jawaban:

139

The ApiController memiliki sifat yang disebut Url yang tipe System.Web.Http.Routing.UrlHelper yang memungkinkan Anda untuk membangun url untuk pengendali api.

Contoh:

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 ini tidak ada di tampilan Anda maupun di pengontrol standar.


MEMPERBARUI:

Dan untuk melakukan perutean di luar ApiController Anda dapat melakukan hal berikut:

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

atau di dalam tampilan:

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

Perhatikan httproute = ""token rute mana yang penting.

Jelas ini mengasumsikan bahwa rute Api Anda dipanggil DefaultApidalam metode RegisterRoutes Anda di Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Darin Dimitrov
sumber
Itu .. benar-benar tidak banyak membantu saya karena saya membutuhkan View saya untuk dapat menghasilkan Url dengan cara yang aman. Jika ada lisensi Go Live, apa cara 'Go Live' untuk membuat url di Tampilan?
Shane Courtrille
Lebih penting lagi ini tidak akan berfungsi jika Anda menggunakan ASP.Net Development Server karena itu mengubah port sepanjang waktu sehingga Anda bahkan tidak dapat meng-hardcore url dalam tampilan.
Shane Courtrille
@ShaneCourtrille, saya telah memperbarui jawaban saya untuk mengilustrasikan bagaimana Anda dapat menggunakan yang normal System.Web.Mvc.UrlHelperuntuk menghasilkan rute Api di luar HttpControllerContext.
Darin Dimitrov
Terima kasih banyak! Saya mencoba menggunakan RouteUrl tetapi tidak tahu tentang persyaratan param httproute.
Shane Courtrille
2
Saya memahami tujuan sampel; Saya mengatakan itu akan menjadi contoh yang lebih berguna jika Anda memasukkan satu baris kode ViewBag karena Anda akan mendemonstrasikan bahwa nilai ini adalah apa yang kami coba dapatkan dalam skenario yang mungkin terjadi dan tidak hanya menjalankan beberapa kode arbitrer. Sekali lagi, saya tidak akan berkomentar jika saya tidak menyia-nyiakan beberapa menit untuk menyadari apa yang saya lewatkan sebelum akhirnya saya menyadari bahwa baris kode tertentu adalah yang relevan.
Jon Davis
43

Ini bekerja dengan bentuk yang lebih sederhana Url.Actionsehingga Anda tidak perlu merujuk nama Perutean apa pun:

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

Anda mungkin ingin menambahkan area = ""jika URL dibutuhkan dalam suatu Area. (Pengontrol api berada di luar Area secara default.) Saya menggunakan MVC 4.

Gábor Imre
sumber
7
UrlHelper di Web Api adalah msdn.microsoft.com/en-us/library/… , tidak memiliki metode tindakan.
Yuriy Faktorovich
8
@YuriyFaktorovich Posting ini menyiratkan bahwa Url.Actionsedang digunakan dari View. Urladalah tipe System.Web.Mvc.UrlHelper, dan tidak memetakan ke WebApirute. Inilah sebabnya mengapa Anda memerlukan parameter tambahan: new { httproute = "" }.
Jesse
3
Saya telah menambahkan httproute""tetapi tidak memetakan = /
Maslow
Saya harus menambahkan tautan dengan area kosong dan htmlAttributes nol @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) tetapi itu bekerja dengan sempurna
Christopher G. Lewis
2
Ini bekerja dengan sempurna dari tampilan, namun, saya tidak yakin mengapa ia menghasilkan nama tindakan sebagai string kueri seperti: / api / dashboard? Action = getdata. Saya mengharapkan ini: / api / dashboard /
getdata
7

Ingin dapat membuat tautan dengan cara yang aman, tanpa string hardcode (nama pengontrol)?

Ada nuget untuk itu! (dan itu ditulis oleh Mark Seeman)

https://github.com/ploeh/Hyprlinkr

Bekerja seperti ini:

Rute, seperti biasa:

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

Dapatkan URL:

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

Hasil:

http://localhost/api/foo/1337
Cristian Diaconescu
sumber
3

Berikut metode KISS untuk menjawab pertanyaan tersebut:

Jika ini adalah kode yang akan Anda gunakan untuk membuat URL pengontrol MVC

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

Untuk mendapatkan URL untuk versi API dari pengontrol (dengan asumsi Anda menggunakan nama pengontrol yang sama), Anda dapat menggunakan

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

Semua metode Url.Action yang dilakukan adalah menambahkan jalur root aplikasi, dengan nama pengontrol, diikuti dengan nama tindakan (kecuali "Indeks" dalam hal ini tidak ditambahkan. Jika objek rute nilai memiliki id properti nilainya juga ditambahkan ke URL.

James Bunch
sumber
Terima kasih! Saya kehilangan api/sebelum nama pengontrol saya.
Daniel Congrove