Cómo crear ASP.NET ¿Url de la API WEB?


En ASP.NET MVC, tenemos @Url.Action para acciones. ¿Hay algo similar como @Url.Api que se dirigiría a / api / controller?

Author: tugberk, 2012-02-29

4 answers

El ApiController tiene una propiedad llamada Url que es de tipo Sistema.Web.Http.Enrutamiento.UrlHelper que le permite construir URL para controladores de api.

Ejemplo:

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

    ...
}

Este UrlHelper no existe ni en tus vistas ni en los controladores estándar.


ACTUALIZACIÓN:

Y para hacer el enrutamiento fuera de un ApiController se puede hacer lo siguiente:

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

O dentro de una vista:

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

Aviso el token de ruta httproute = "" que es importante.

Obviamente esto asume que su ruta Api se llama DefaultApi en su método RegisterRoutes en Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
 128
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-29 16:44:25

Funciona con la forma más simple de Url.Action por lo que no tiene que hacer referencia a ningún nombre de enrutamiento:

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

Es posible que desee agregar un area = "" si la URL es necesaria dentro de un Área. (Los controladores Api están fuera de las áreas de forma predeterminada.) Estoy usando MVC 4.

 43
Author: Gábor Imre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-14 12:13:55

¿Desea ser capaz de generar enlaces de forma segura, sin cadenas codificadas (nombres de controlador)?

¡Hay un nuget para eso! (y está escrito por Mark Seeman)

Https://github.com/ploeh/Hyprlinkr

Funciona así:

Rutas, como de costumbre:

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

Obtener una URL:

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

Resultado:

http://localhost/api/foo/1337
 5
Author: Cristi Diaconescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-16 14:43:37

Aquí está el método KISS para responder a la pregunta:

Si este es el código que usarías para crear una URL del controlador MVC

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

Para obtener una URL para la versión API del controlador (suponiendo que use el mismo nombre del controlador) puede usar

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

Toda la Url.Action method is doing is appending the root path of the application, with the controller name, followed by the action name (unless it is "Index" in which case it is not appended. si la ruta el objeto values tiene una propiedad id el valor también se anexa a la URL.

 1
Author: James Bunch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-04 18:13:51