2015-12-23 9 views
5

パラメータなしのポストメソッドを含むwebAPIコントローラを呼び出すと、メソッドに移動します。しかし、私がパラメータを渡すと(そして、パラメータコントローラでapiコントローラを更新しても)、これは第1のスニペットの下にあるスニペットを参照してください。これはPOSTエラーを405エラーにします。パラメータ付きWebAPIポストメソッドが機能しません

var captchURL = "/api/Captcha"; 
$.ajax({ 
     url: captchURL, 
     dataType: 'json', 
     contentType: 'application/json', 
     type: 'POST' 
}) 



var jsondata = {solution: "7", answer: "7"}; 
    var captchURL = "/api/Captcha"; 
    $.ajax({ 
      url: captchURL, 
      dataType: 'json', 
      contentType: 'application/json', 
      type: 'POST', 
      data: JSON.stringify(jsondata) 
    }) 

UPDATE - コントローラコード:

public class CaptchaController : ApiController 
{ 
    private readonly ICaptchaService _service; 
    public CaptchaController(ICaptchaService service) 
    { 
     _service = service; 
    } 

    public Captcha Get() 
    { 
     return _service.Get(); 
    } 

    [HttpPost] 
    public bool Post(string solution, string answer) 
    { 
     return _service.Post(); 

    } 
} 

UPDATE - WebApiConfig:

 config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

私は解決策や答えのparamsを持っていないので、それは(私の中WebApiConfig)は認識できませんか?

私は間違って何をしていますか?

+0

コントローラのポストコード – jpgrassi

+0

コントローラコードで更新しました - 私はちょうどPostメソッドにパラメータを追加しました – webdad3

+0

@ webdad3なぜデータをストリング化したのですか?あなたは 'data:jsondata'で十分ではないと思います – meda

答えて

6

これは経路を設定する方法が少し異なりますが、私はそれを優先します。あなたが正しく入力されたパラメータを使用して、パスを正しく設定しているので、これがある限り動作するはず

[RoutPrefix("Captcha")] 
public class CaptchaController : ApiController 
{ 

    [Route("Post/{solution}/{answer}")] 
    [HttpPost] 
    public bool Post(string solution, string answer) 
    { 
     return _service.Post(); 

    } 
} 

お使いのコントローラのコードGETリクエストのPOSTを代表する各メソッドのルートプレフィックスとルートを追加で ...正しく型付けされた値を返す。モデルを使用する場合は、パラメータをルートパスに追加する必要はありません。

私はWebAPIを設定していたときにこれがうまくいった。誰か説明が間違っているとわかったら教えてください。私はまだ学んでいます(そして、いつもあります)が、私が働いたことをあなたに伝えたいと思っていました。

4

コントローラは、この

[HttpPost] 
public string Post([FromBody] Captcha cap) 
{ 
    return cap.solution + " - " + cap.answer; 
} 
+0

私がこれをしたとき、私はコントローラに入ったが、 "キャップ"はヌルだった。 – webdad3

+0

あなたのuriが正しいと確信していますか?これをやろうとしてください。var captchURL = "api/captcha"; –

+0

陽性。私は変更なしでcaptchURLも変更しました。 – webdad3

3

をパラメータとして 'ソリューション' と '答え' を受け入れる別のMapHttpRouteを追加しているモデル

public class Captcha { 
    public string solution { get; set; } 
    public string answer { get; set; } 
} 

を作成サンプル:

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{solution}/{answer}", 
      defaults: new { solution = RouteParameter.Optional, answer= RouteParameter.Optional } 
     ); 
2
[HttpPost] 

public bool Post(Captcha cap) 
{ 
    return _service.Post(); 
} 

そして

変更data : jsondataからdata: JSON.stringify(jsondata)

1

あなたの[投稿]アドレス--api/captcha /に2つのパラメータを受け入れるルートがないために動作しない理由があります。

あなたはどちらかによる

[Route("Post/{solution}/{answer}")] 
[HttpPost] 
public bool Post(string solution, string answer) 
{ 
    return _service.Post(); 

} 

としてコントローラにルーティング属性を設定したり、

Public class CaptchaModel 
{ 
    Public string Solution {get; set;} 
    Public string Answer {get; set;} 
} 

などのモデルを作成し、アクションメソッド

[HttpPost] 
public bool Post([FromBody] CaptchaModel model) 
{ 
    var solution = model.solution; 
    var answer = model.answer; 
    ......... 
    return _service.Post(); 
} 
1

さらに参照あなたはあなたの要求からJSON.stringify(データ)を削除してから、前に[FromBody]あなたのモデルを追加する必要があります。その後、それは動作します。

関連する問題