2017-02-13 6 views
1

私はWeb APIを使い始めています(Web Devから離れていましたが、これ以上誰もSOAPを気にしていないようです)。 PUTしようとしている。Web APIのPUTは常に "0"をサーバに入れます

私はオンラインチュートリアルに続き、GETとDELETEでうまく動作します。テストするために、私はPostmanを使用しています。これは、Postmanでテストされている別のサービスから呼び出されるためです。ここでGETのためのコードは次のとおりです。

は、すべての書籍を取得します。

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

はIDで書籍を購入:

// 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で書籍を削除します。

// 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やDELETEを選択したときにはかなりうまく機能http://localhost/api/Books/1ところで

、(私は本当に今郵便配達員の内部の仕組みに取得する必要はありません)

しかし、私は唯一の送信する必要があるように私は、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メソッドに追加しようとしましたが、状況が悪化するだけです。私はそれがかなり新人だと知っていますが、私が言ったように、私は年齢のWeb開発者に対処していません。ご意見をお聞かせください。

+2

これはPUTの仕組みではありません。 '{" Housenumber ":" 42 "}'のように更新するリソースの一部または全部をPUTします。この属性からわかるように、整数は本文から読み込まれます。その場合、リクエスト本体はちょうどそれでなければなりません:addressという名前の整数、 '{address:42}'です。 – CodeCaster

答えて

4

あなたが持っているコード:

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

はあなたが番号を含むリクエストボディを送信するために期待しています。 REST APIで

は、PUT動詞は、通常、このような方法で実装されています

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

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

次に、あなたは次のようにリクエストボディでhttp://myapi.com/api/Books/23にHTTPリクエストを送信することができます編集:

実際これはすべて典型的なパターンです。ご希望の場合は、属性ベースのルーティングを行うと、あなたが望むものを達成することができます。この場合

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

    } 
} 

あなたはルートがアクション何のためにあるのかを定義する属性ベースのルーティングを使用しています。 [RoutePrefix]ここでは、コントローラ内のすべてのルートをどのように開始するかを定義します。

+0

ああ、私はそれを手に入れます。私の場合、リクエストボディは必要ありません。シンプルなURLを使用してサーバにアドレスを取得する必要があるので、別のコントローラを追加するだけで、 "AddressController"と言うべきでしょう。私が必要とすることをする方法を得る?アドレスロジックとリストロジック( "Books")は、お互いに何の関係もありません。 – makoshichi

+3

私の投稿を編集しました。もしあなたが本当にそれをしたいのであれば、属性ルーティングを使ってデフォルトのルーティングスキームを上書きすることができます。 – juunas

+1

素晴らしい男は、私の意図どおりに動作します。私はまだWebFormsが事だったのでWebと連絡を取っていませんでした。本当にありがとう! – makoshichi

関連する問題