Web API Restful Service C#执行SQL查询
问题描述:
使用web api restful服务。Web API Restful Service C#执行SQL查询
我有一张名为测试的表。主键是自动递增的。每行包含一个用户名和一个测试问题。这个数据库并没有真正优化,但它不需要。
因为主键只是一个int,以保持每行都是唯一的,所以有很多行有重复的用户名。这可以。
我希望能够用匹配用户名返回所有行。
我希望能够用URL中的GET请求来做到这一点:www.mywebsite.com/api/tests/{username}
在Visual Studio中的默认控制器方法只能通过搜索主键返回一个唯一的结果。
这就像我想要的东西,但它不起作用。 500错误。我对调试不熟悉,所以如果可能的话,请指向正确的方向,以便我可以提供更多信息。
// GET: api/Tests/robert
[ResponseType(typeof(Test))]
public async Task<IHttpActionResult> GetTest(string id)
{
//This is the default approach that just searches by primary key
//Test test = await db.Tests.FindAsync(id);
/*This is roughly what I want. Compiles, but doesn't work.*/
var query = "SELECT* WHERE id=" + id;
Test test = db.Tests.SqlQuery(query, id);
if (test == null)
{
return NotFound();
}
return Ok(test);
}
让我知道我搞砸了。几个小时以来,我一直在为此感到失望。我不认为在这方面特别优秀。
答
尝试宣告你的方法是这样
[RoutePrefix("api")]
public class HisController : ApiController
{
[HttpGet]
public HttpResponseMessage Test(string name) {...}
}
另外,我建议您使用实体框架
[RoutePrefix("api")]
public class HisController : ApiController
{
[HttpGet]
public HttpResponseMessage Test(string name)
{
using (MyEntities bm = new MyEntities())
{
var usr = bm.Users.Where(u => u.Name == name).ToList();
if (usr.Count() > 0)
return Request.CreateResponse(HttpStatusCode.OK, new
{
Success = true
,
Message = "Total users: " + usr.Count()
,
Data = usr
});
return Request.CreateResponse(HttpStatusCode.NotFound, new { Success = false, Message = "No users found..." });
}
}
}
我会第二的EF方法。来自OP的代码对SQL注入攻击是开放的。当你将它们发送到SQL查询中时,你绝不应该信任输入,也绝对不能。 – heartlandcoder
他将永远不会使用www.mywebsite.com/api/tests/{username}命中此方法,除非他更改了默认绑定。如果RouteConfig需要使用此URL模式访问此方法,则需要更新RouteConfig。 – RizJa
那是真实的,我认为他有正确的配置他的课'[RoutePrefix( “API”) 公共类HisController:ApiController {[HTTPGET] 公共HttpResponseMessage测试(字符串名称){...}}' – Rafa