web-dev-qa-db-ja.com

修正方法-リクエストされたリソースはhttpメソッド「POST」をサポートしていません

以下はWebAPIアクションです。以下のエラーについてグーグルで:

要求されたリソースはhttpメソッド 'POST'をサポートしていません

リンクの数を取得し、それに応じてAPIを更新しましたが、それでも同じエラーが発生します。

しかし、それでもポストマン経由で上記を呼び出すと、エラーがスローされます。

Error

このエラーを取り除くにはどうすればよいですか?

また、メソッドパラメータリストで[FromBody]属性を使用せずにこれを修正することは可能ですか?

どんな助け/提案も高く評価されます。ありがとう。

11
Kgn-web

URLパラメータを必要とするルートを宣言しました

_[Route("rename/{userId}/{type}/{title}/")]
_

したがって、_api/customer/rename_にリクエストを送信すると、このメソッドと一致しません。リクエスト本文で渡すパラメータをルートパラメータから削除する必要があります

_[Route("rename")]
_

コントローラに適切なRoutePrefix("api/customer")属性があることを確認してください。


2番目の問題は、複数の_[FromBody]_パラメーターです。 ca n't bind multiple parametersエラーが発生します。制限があります-FromBodyとしてマークできるパラメーターは1つだけです。 Simple Simple Types の注を参照してください:

Web APIはリクエスト本文を最大で1回読み取るため、リクエスト本文から取得できるアクションのパラメーターは1つだけです。リクエストの本文から複数の値を取得する必要がある場合は、複合型を定義します。

すべてのパラメーターを保持する複合型を作成する必要があります

_public class RenameModel
{
   public int UserId { get; set; }
   public string Type { get; set; }
   public string Title { get; set; }
}
_

そして、メソッドの署名を

_[HttpPost]
[Route("rename")]
public IHttpActionResult Rename(RenameModel model)
_

application/x-www-form-urlencodedとしてリクエストデータを送信します

5
 [Route("rename/{userId}/{type}/{title}/")]
 public IHttpActionResult Rename([FromBody] int userId,  [FromBody] string  type, [FromBody] string title)

最後の答えは正しいです。ルートでこれらのパラメーターを要求していますが、投稿の本文でそれらを期待していると言っています。また、通常、ルートは動詞ではなく名詞で始まります。名前を変更するのは何ですか? (つまり、[Route( "users/rename/{userId}/{type}/{title}")]

最初の投稿に基づいて、代わりにこれを試してください:

 [HttpPost]
 [Route("rename/{userId}/{type}/{title}" Name = "RenameUser"]
 public IHttpActionResult Rename(int userId, string type, string title)
 {
     _myServiceMethod.Rename(userId, type, title);
     return new StatusCodeResult(HttpStatusCode.Created, this);   
 }

または、本文に情報を含めて投稿する場合:データコントラクトを宣言します。

public class User
{
    public string Type { get; set; }
    public string Title { get; set; }
}

次に、エンドポイントで:

[HttpPost]
[Route("rename/{userId}", Name = "RenameUserPost")]
public IHttpActionResult RenameUserPost(int userId, [FromBody] User userData)
{
    return new StatusCodeResult(HttpStatusCode.Created, this);
}

どちらの場合も、「this」はApiControllerから継承するコントローラークラスを指すことに注意してください。これらの両方をSwaggerで確認し、POSTを受け入れ、ステータスコードを返しました。

お役に立てれば。

1
jeffj23