8

ブラウザからサーバーに渡したいデータ「Foo」があり、foo に含まれる情報に基づいて予測統計を取得します。

$.ajax({
      type: 'GET',
      url: "/api/predictedStats/",
      data: "foo=" + ko.toJSON(foo, fooProperties),
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',
      success: function(data) {
        return _this.viewModel.setPredictedStats(data);
      },
      error: function(jqXHR, statusText, errorText) {
        return _this.viewModel.setErrorValues(jqXHR, errorText);
      }
    });

予測統計コントローラーを作成し、Foo の引数を取る get メソッドを作成しました。

public class PredictedStatsController : ApiController
{
    public PredictedStats Get(Foo foo)
    {
        return statsService.GetPredictedStats(foo);
    }
}

Get メソッドにブレークポイントを設定すると、Foo オブジェクトが常に null であることがわかります。次の行のみをログに記録する webapi トレースからスローされるエラーはありません。

WEBAPI: opr[FormatterParameterBinding] opn[ExecuteBindingAsync] msg[Binding parameter 'foo'] status[0]  
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Type='foo', content-type='application/json; charset=utf-8'] status[0]  
WEBAPI: opr[JsonMediaTypeFormatter] opn[ReadFromStreamAsync] msg[Value read='null'] status[0]   

サーバー上に Foo オブジェクトを作成するために、投稿を介して Foo コントローラーにデータを送信しても問題ないので、クライアント側で作成された json に問題はないと言えます。

フィドラーで見ると、結果の Get は次のようになります。ここで、jsondata はオブジェクト foo です。

GET /api/predictedStats?foo={jsondata} HTTP/1.1

これは可能ですか、それとも私はこれについてすべて間違っていますか?

ありがとうニール


編集:私はこれが次のように機能するようになったように感じます

public PredictedStats Get([FromUri]Foo foo)
{
    return statsService.GetPredictedStats(foo);
}

オブジェクト foo は正常に戻ってきましたが、Foo のプロパティは適切に設定されていませんでした。


その間、「foo =」をドロップするだけでほぼ同一のデータでPOSTを使用することに頼りましたが、これはうまく機能しています。

この場合に POST と GET のどちらを使用する必要があるかはわかりませんが、興味深い点です。


また、このhttp://bugs.jquery.com/ticket/8961を見つけました。これは、jquery を使用して GET リクエストに本文を添付できないことを示唆しているように思われるため、POST がおそらく唯一の賢明なオプションです。

4

1 に答える 1

6

あなたはほとんどそこに着きました:)

使用する場合[FromUri](デフォルトでは Web API は複雑なオブジェクトを「バインド」しないため、「複雑な」オブジェクトに使用する必要があり、常に本体から逆シリアル化しようとします) param=、Uriを渡す必要はありません。値のメンバーをクエリ文字列パラメーターとして渡すだけです。つまり'member1=value&member2=value'member1member2は のメンバーですFoo

jQuery には「バグ」がないことに注意してください。HTTP 仕様ではリクエスト本文が禁止されていませんが、ブラウザで禁止されている可能性があります (その場合、jQuery はそれを送信できません)。とにかく、サーバーは決してそれを読み取りません。それは受け入れられない練習です。また、キャッシュに関して興味深い問題が潜在的にあり、ブラウザは POST、PUT、DELETE などをキャッシュせず、応答ヘッダーで禁止されていない場合は GET をキャッシュします。これは重大な副作用を引き起こす可能性がありますクライアント アプリケーション。この SO: HTTP GET with request bodyを参照して、この件に関する詳細と役立つリンクを確認することをお勧めします。

同様に、jQuery を使用する場合 (オブジェクトを JSON に変換する必要もありませんdata)、オプションのメンバーに javascript オブジェクトを渡すだけで、jQuery はそれを正しい形式に変換します。

あるいは、Web API は、jQuery が渡す形式を理解します。

于 2012-08-02T21:49:01.527 に答える