3

Visual Studio2012RCを使用しています。デフォルトルートを使用しており、次のWebAPIコントローラーがあります。

public class FooController : ApiController
{
    // GET api/foo
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/foo/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/foo
    public string Post(string abc)
    {
        Console.WriteLine("value: {0}", abc);
        return "foo" + abc;
    }

    // PUT api/foo/5
    public void Put(int id, string value)
    {
    }

    // DELETE api/foo/5
    public void Delete(int id)
    {
    }
}

FiddlerでPOSTの簡単なテストをしたかったので、

リクエストヘッダー
ユーザーエージェント:フィドラー
コンテンツタイプ:application / json

リクエスト本文
{"abc": "def"}

リクエストをデバッグすると、パラメータabcは「def」ではなくnullとして返されます。Fiddler構文に何か問題がありますか?

4

2 に答える 2

5

(1)デフォルトでは、単純型はURIから取得されます。リクエスト本文から単純型を読み取るには、[FromBody]属性をパラメーターに追加します。

public string Post([FromBody] string abc)

(2)'{"abc": "def"}'は、 "abc"という名前のプロパティを持つオブジェクトを定義します-JSON文字列を送信するには、リクエストの本文は"def"である必要があります

于 2012-08-08T20:31:04.270 に答える
0

この回答は、ASP.Net Web APIサイトsending-html-form-dataのリンクからのものであり、Mikeのブログ投稿であることが判明しました(最初は気づいていませんでした)。Web APIチームは、通常のMVCコントローラーとはまったく異なるパラメーターバインディングを使用していくつかの決定を行いました。

「単純型」を送信するための正しい構文は次のとおりです。

public HttpResponseMessage PostSimple([FromBody] string value)
{
// code goes here

そしてフィドラーでは、あなたは

=def          //THIS CANNOT HAVE QUOTES AND = IS MANDATORY

OK、これがMVCとは非常に異なる動作をする部分です。

  1. マイクが言うように、[FromBody]を使用する必要があります。
  2. パラメータは1つだけです。複数のパラメータが必要な場合は、2つの選択肢があります。i)リクエスト本文の代わりにURLクエリパラメータを使用するか、ii)複雑なオブジェクト(つまり、独自のクラス)を使用します。
  3. リクエストの本文は単純な=defである必要があり、名前付きパラメーターを使用することはできません。
于 2012-08-09T14:37:37.807 に答える