2016-05-30 100 views
0

使用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); 
    } 

讓我知道我搞砸了。幾個小時以來,我一直在爲此感到失望。我不認爲在這方面特別優秀。

回答

1

嘗試宣告你的方法是這樣

[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..." }); 
     } 
    } 
} 
+1

我會第二的EF方法。來自OP的代碼對SQL注入攻擊是開放的。當你將它們發送到SQL查詢中時,你絕不應該信任輸入,也絕對不能。 – heartlandcoder

+1

他將永遠不會使用www.mywebsite.com/api/tests/{username}命中此方法,除非他更改了默認綁定。如果RouteConfig需要使用此URL模式訪問此方法,則需要更新RouteConfig。 – RizJa

+0

那是真實的,我認爲他有正確的配置他的課'[RoutePrefix( 「API」) 公共類HisController:ApiController {[HTTPGET] 公共HttpResponseMessage測試(字符串名稱){...}}' – Rafa