【问题标题】:Can't figure out how WEB API Calls URLS无法弄清楚 WEB API 如何调用 URLS
【发布时间】:2018-12-15 19:11:42
【问题描述】:

我正在学习 ASP.NET Web 表单上的 WEB API,并已在我的项目中实现它以在模式上显示一些数据,但我无法弄清楚 api url 是如何创建的。

我按照这个教程 https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

这是我的 AJAX 调用

<script type="text/javascript">

    function ShowUserModal(lnk, IdColaborador) {

        debugger
        //var s = lnk.id;
        //var start = s.indexOf("lnkEdit");
        //var end = s.lastIndexOf("_");
        //sub = s.substring(start, end);
        //s = s.replace(sub, "IdMatriz");
        //var hidden = document.getElementById(s);
        //var id = hidden.value;
        //alert(id);

        var uri = 'api/users/';

        $.ajax({

            URL: uri,
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            data: IdColaborador,
            success: function (data) {

                alert("Saved successfully");
            },
            fail: function(jqXHR, textStatus) {
                alert("Request failed: " + textStatus);
            }

        })
    }        
</script>

这是我的控制器

 public class UsersController : ApiController
{
    public User user { get; set; }


    //public IEnumerable<User> GetAllUsers()
    //{

    //    return users;
    //}

    public IHttpActionResult GetUser(int id)
    {
        user = new User();

        string constr = ConfigurationManager.ConnectionStrings["ControloInterno_ConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand("spOperadores", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Action", "SELECTINF");                   
                cmd.Parameters.AddWithValue("@IdColaborador", id);

                con.Open();
                using(SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        user.Nome = sdr["Nome"].ToString();
                        user.Criador = sdr["criador"].ToString();
                        user.DataAdm = Convert.ToDateTime(sdr["dataadmin"]);
                        user.AltData = Convert.ToDateTime(sdr["AltData"]);
                        user.Telemovel = sdr["tele"].ToString();
                        user.Departamento = sdr["Departamento"].ToString();
                        user.status = sdr["status"].ToString();
                        user.DescricaoPerfil = sdr["DescricaoPerfil"].ToString();
                        user.Observacoes = sdr["Observacoes"].ToString();
                    }
                }                                    
            }
        }

        return Ok(user);
    }
}

我必须在 global.asax 中使用它才能工作

protected void Application_Start(object sender, EventArgs e)

    {
        RouteTable.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = System.Web.Http.RouteParameter.Optional }
        );
    }

所以我的问题是,网址是如何生成的?如果我的控制器叫UsersController,而类叫User,为什么叫api/users

【问题讨论】:

  • 它使用您的控制器的模板和名称。 routeTemplate: "api/{controller}/{id}" --> 你的控制器名称是 Users(Controller) 因此你得到 api/users 你也可以使用属性路由,只需尝试应用 [Route("api/[controller] ")] 属性在您的控制器类声明上方, [Route("getusers")] 等在每个端点方法上方。这将产生如下的 url:: localhost:xxx/api/users/getusers
  • 我试图这样做,[Route("api/[controller]")] 在控制器类的顶部和 [Route("GetUser/{id}")] 在方法上,但是它不起作用,我用 api/users/GetUser/5 调用它。我还评论了我在 global.asax 中的内容,但后来我尝试更改 global asax 中的 url,并添加了“api/{controller}/{Action}/{id}”,当我输入 api/users/getUser 时它起作用了/16

标签: javascript c# asp.net


【解决方案1】:

如果您使用属性路由,请确保在 HttpConfiguration 上调用以下函数:

  // Web API routes
  config.MapHttpAttributeRoutes();

您可以在此处阅读有关属性路由的更多信息: Web api attribute routing 或者,如果您将使用 MVC,请阅读此处: Attribute routing in MVC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 2018-10-27
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多