2013-12-13 69 views
1

我看到這個代碼在書上,是與客戶端創建一個對象(僱員,在這種情況下)提供ID的例子:這段代碼是詳細的還是我誤解了?

public HttpResponseMessage Put(int id, Employee employee) 
{ 
    if (!list.Any(e => e.Id == id) 
    { 
     list.Add(employee); 

     var response = Request.CreateResponse<Employee>(HttpStatusCode.Created, employee); 

     string uri = Url.Link("DefaultApi", new { id = employee.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 
    return Request.CreateResponse(HttpStatusCode.NoContent); 
} 

我知道如何工作,但不會下縮寫代碼也適用:

public HttpResponseMessage Put(Employee employee) 
{ 
    if (!list.Any(e => e.Id == employee.Id) 
    { 
     list.Add(employee); 

     var response = Request.CreateResponse<Employee>(HttpStatusCode.Created, employee); 

     string uri = Url.Link("DefaultApi", new { id = employee.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 
    return Request.CreateResponse(HttpStatusCode.NoContent); 
} 

+1

帶'PUT'動詞的路由'api/employee/{id}'?如果是這樣,你需要'id'參數。 –

+1

@David爲什麼你需要將id作爲參數,如果employee參數已經有相同的賦值? – varevarao

+1

@varevarao也許約定;也許被傳遞的模型沒有定義id。當您更新應該可以通過唯一URI訪問的現有資源時,可能需要符合REST。 –

回答

1

你的建議,詳細的解決方案少並沒有錯,它只是改變了的ASP.NET Web API如何查找您正在傳遞中的值缺省機制。

id是一個簡單的類型,所以ASP.NET Web API將在請求URI中查找該值,而Employee是一種複雜類型,因此ASP.NET Web API需要在請求正文中查找。因此,如果您的路由設置要求id成爲URI的一部分,那麼將id作爲一個單獨的參數會更有意義,因爲它將自動從URI中選取。

您可以指示的ASP.NET Web API使用你的參數[FromUri]屬性,像這樣的請求URI看:

public HttpResponseMessage Put([FromUri]Employee employee) 
{ 

} 

現在,如果你傳遞一個Employee對象的組成部分中請求的查詢字符串,那麼的ASP.NET Web API將挑選出的這些信息,並建立從Employee對象,像這樣:

http://localhost/api/values/?FirstName=John8&LastName=Doe 

注意:我正在彌補FirstNameLastName的名稱,但它們需要匹配您的模型類的public屬性。


欲瞭解更多信息,請閱讀Parameter Binding in ASP.NET Web API

2

如果PUT路線/ API方法被定義爲api/employee/{id},那麼你就需要在id過去了。但是,如果你Employee對象已有的ID,那麼你可能只是有api/employee路線爲PUT動詞並且只需接受像第二個示例所示的Employee對象。

example的Web API,文檔指出:

默認情況下,ASP.NET的Web API框架從請求主體的路線和複雜類型只接受簡單的參數類型 。

相關問題