ブラウザからサーバーに渡したいデータ「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 がおそらく唯一の賢明なオプションです。