2017-02-13 48 views
1

我從Web API開始(我已經離開web dev一段時間了,似乎沒有人在意SOAP),但是我遇到了一些麻煩試圖放棄。PUT在Web API中總是會把「0」放到服務器上

我跟着一個在線教程,它適用於GET和DELETE。爲了測試,我使用郵差,因爲這將從另一個服務,這也是與郵差測試。下面是獲得代碼:

獲取所有的書:

// GET: api/Books 
public IEnumerable<Book> Get() 
{ 
    return Library.Books; 
} 

通過ID獲取書:

// DELETE: api/Books/<int> 
public IHttpActionResult Delete(int id) 
{ 
    Book book = Library.Books.FirstOrDefault(l => l.ID == id); 

    if (book != null) 
    { 
     Library.Books.Remove(book); 
     return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK)); 
    } 
    else 
     return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.NotFound, "Book not found.")); 
} 

它們都運行良好:

// GET: api/Books/<int> 
public IHttpActionResult Get(int id) 
{ 
    Book book = Library.Books.FirstOrDefault(l => l.ID == id); 

    if (book != null) 
     return ResponseMessage(Request.CreateResponse<Book>(HttpStatusCode.OK, book)); 
    else 
     return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.NotFound, "Book not found.")); 
} 

通過ID刪除書並將服務於我的目的,因爲我必須返回一個對象列表,所以一切都很好。

BTW,http://localhost/api/Books/1作品被選中GET或DELETE時相當不錯(我並不真的需要進入郵遞員的內部運作現在)

但我已經改變了PUT方法,因爲我只需要發送一些int(一個地址)給這個服務。下面是測試代碼:

// PUT: api/Books/<int> 
public IHttpActionResult Put([FromBody]int address) 
{ 
    if (address == 0) 
     return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.BadRequest, "Value cannot be zero")); 
    else 
     return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK)); 
} 

調試時,參數「地址」永遠是零,如果稱爲這樣:http://localhost/api/Books/80,或任何其他INT。換句話說,我對PUT的迴應將始終是「值不能爲零」。我嘗試刪除[FromBody]並將[HttpPut]屬性添加到PUT方法,但這隻會讓事情變得更糟。我知道這很新鮮,但就像我說的,我在很久以前就沒有處理過網絡開發。請指教。

+2

這不是PUT的工作原理。你需要部分或全部資源被更新,所以'{「Housenumber」:「42」}'。正如您從屬性中看到的那樣,整數是從主體讀取的。在這種情況下,你的請求體應該就是:一個名爲address的整數,所以'{address:42}'。 – CodeCaster

回答

4

的代碼,你有:

public IHttpActionResult Put([FromBody]int address) 
{ 
} 

希望你發送包含號碼的請求體。

在REST API中,PUT動詞的方式通常被實現這樣的:

public IHttpActionResult Put(int id, [FromBody]Book book) 
{ 
    //Update book with id == id with info from book 
} 

然後你就可以發送一個HTTP請求http://myapi.com/api/Books/23與請求的身體像:

{ 
    "title": "Updated title", 
    "author": "Updated author" 
} 

編輯:

其實這一切都只是典型的模式。如果你願意,你可以做基於屬性的路由,並達到你想要什麼:

[RoutePrefix("api/Books")] 
public class BooksController : ApiController 
{ 
    [HttpPut] 
    [Route("{address}")] 
    public IHttpActionResult Put(int address) 
    { 

    } 
} 

在這種情況下,你使用基於屬性的路由定義路由是什麼動作。 [RoutePrefix]這裏定義了控制器中的所有路由應該以什麼開始。

+0

啊,我明白了。就我而言,我真的沒有需要請求主體,我只是需要獲得地址使用簡單的URL服務器,所以也許我應該只需要添加另一個控制器,說「AddressController」,並使用其GET方法來做我所需要的?地址邏輯和邏輯表(以下簡稱「叢書」)無關相互反正... – makoshichi

+3

編輯我的職位,如果你真的想這樣做,你可以使用屬性路由到這裏覆蓋默認的路由方案。 – juunas

+1

神奇的人,作品就像我的本意。我沒有一直在與網絡聯繫,因爲WebForms的仍是一個事情,所以我通常會丟失的時候,我必須把事情搞定。謝謝一堆! – makoshichi