2012-08-02 41 views
8

我有一些數據「富」,我想從瀏覽器向服務器傳遞和獲取基於包含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的方法。

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

堅持Get方法的斷點我看到Foo對象始終爲空。 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] 

我已經沒有任何問題通過POST發送數據到富控制器的服務器上創建Foo對象,所以我可以說沒有什麼錯用JSON創建客戶方。

展望小提琴手所產生的獲取如下所示,其中jsondata是對象foo。

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

這是甚至可能或我是否在談論這一切都是錯誤的?

感謝 尼爾


編輯: 我覺得我幾乎得到了這方面的工作有以下

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

的對象foo回來了罰款,但不富的性質正在填充正常。


在我開始藉助與幾乎相同的數據只是刪除了一個POST的平均時間爲「foo =」,這是工作得很好。

我不知道是否有POST或GET應在這種情況下使用,但是這將是有趣的瞭解。


我也發現了這個http://bugs.jquery.com/ticket/8961這似乎表明你不能一個機構重視與jQuery的一個GET請求,以便POST可能是唯一明智的選擇

回答

6

你幾乎到了那裏:)

當您使用[FromUri](你必須使用的,因爲默認的Web API「複雜」的對象不「綁定」複雜的對象,它總是希望從身體反序列化他們),你並不需要通過param=在Uri - 您只需將值的成員作爲查詢字符串參數傳遞即可。也就是說'member1=value&member2=value' - 在member1member2Foo的成員。

請注意,jQuery中沒有'錯誤' - 雖然HTTP規範不禁止請求體,但瀏覽器可能會這樣做(如果是這種情況,jQuery不能發送它),它是無論如何,服務器永遠不會讀取它。這只是不被接受的做法。它也具有緩存方面的有趣問題,因爲瀏覽器不會緩存POST,PUT,DELETE等,但是如果響應頭文件不禁止它會緩存GET - 這可能會產生嚴重的副作用客戶端應用程序。我建議你看看這個SO:HTTP GET with request body瞭解更多信息和一些有關這個問題的有用的鏈接。

同樣,使用jQuery的時候 - 你不需要將對象轉換爲JSON或者 - 只是傳遞的選項data成員JavaScript對象和jQuery把它變成正確的格式。

或者應該是,Web API會理解jQuery將其傳遞的格式。

+1

謝謝,我正在抓我的頭,爲什麼'複雜對象'參數沒有填充,雖然我用'[FromUri]'裝飾了它。我嘗試通過json例如?param = {Name:Foo}哪個不起作用,我不得不將它改成?Name = Foo,就像你說的那樣。請注意,如果您有多個'[FromUri]'複雜的對象參數,則需要確保它們不具有相同名稱的屬性 - 否則最終將爲這兩個實例分配相同的屬性值。 – 2012-09-01 17:53:47

+2

請注意,一個簡單的'公共字符串member1;'不會工作,'member1'仍然是'null'。把它們變成**屬性**,它會正常工作。 – Thomas 2012-10-14 20:47:17

+0

關於他們必須是財產...我爲什麼不讀這4個小時前。談論感覺愚蠢,感謝托馬斯這個簡單而又完美的評論。 – 2013-06-21 15:34:42

相關問題