2013-08-26 73 views
0

我有一個Durandal /熱毛巾測試應用程序,我試圖連線。我有下面的ajax調用,但我得到一個404錯誤。MVC Web API沒有從javascript調用ajax

GET HTTP /.../ API /比薩/ GetPizzasByOrderId%22a8926610-a713-494c-bb15-46f6487a01c7%22 404(未找到)

我可以將URL手動更改爲:

http /.../ api/GetPizzasByOrderId?orderId = a8926610-a713-494c-bb15-46f6487a01c7

它的工作原理。 但我想知道爲什麼其他調用不工作或更多,爲什麼ajax搞亂了URL中的參數,而不是像複雜對象那樣的數據。我有一個得到和一個工作得很好的保存。該GET具有零個PARAMS和保存是通過一個複雜的對象

C#網絡API控制器:

public class PizzaController : ApiController 
{ 
    [HttpGet] 
    public IEnumerable<Pizza> GetPizzasByOrderId(Guid orderId) 
    { 
     return DATA.GetPizzasByOrderId(orderId); 
    } 
} 

JAVASCRIPT:

var dataCall = $.ajax(config.getPizzasByOrderIdUrl, { 
    data: ko.toJSON(orderId), 
    type: "get", 
    contentType: "application/json" 
}); 

我應該改變我JavaScript代碼到下面,並完成它或有沒有更好的方式來與API交談?

var getPizzasByOrderId = function (orderId) { 
    return Q.when($.getJSON(config.getPizzasByOrderIdUrl + "?orderId=" + orderId)); 
}; 

回答

1

您既可以使用代碼,你在這最後的代碼塊有它,或者你可以在一個對象傳遞到位您的訂單ID的,如下面的代碼塊。無論哪種方式,區別在於正在命名orderId參數。

var dataCall = $.ajax({ 
    url: config.getPizzasByOrderIdUrl, 
    type: "GET", 
    data: {orderId : orderId}, 
}); 

至於爲什麼$。阿賈克斯()正常工作對您的文章,您可以通過運行這些代碼兩位和查看整個走線的要求很容易地檢查了這一點。我建議使用谷歌瀏覽器。

  1. 載有jQuery的頁面加載
  2. 打開開發人員工具並轉到控制檯
  3. 輸入下面的代碼片段

    $阿賈克斯( 「」,{ 數據:{ orderId:123}, type:「get」, contentType:「application/json」 });

  4. 切換到網絡選項卡並點擊,在?訂單ID = 123

  5. 通知結束一個,它確實具有所附作爲查詢字符串參數的數據
  6. 在片段上方,取代「得到「with」post「
  7. 當您按回車鍵後,您應該在開發人員工具的網絡選項卡上看到另一個請求。
  8. 請注意,當只改變請求類型時,數據將從查詢字符串移至主體。正如在評論中指出的那樣,WebApi將從請求的主體中拉出並使用模型綁定器來填充複雜的對象。
+1

這是正確的。 ASP.NET WebApi根據HTTP動詞,命名參數及其數據類型選擇控制器操作。得到這些錯誤之一,它會返回404。 – Brett

+0

您的代碼塊不起作用。它嘗試在orderId周圍加引號並引發400錯誤。將toJson放在單個參數中沒有意義。 – Boone

+0

雖然這讓我感到困惑。我知道如果我指定了像上面那樣的參數(不包括toJson部分),它可以工作。但是,如果你看看這個答案。 http://stackoverflow.com/questions/14507101/mvc-api-controllers-complex-object-not-getting-populated-from-jquery-ajax-call ...爲什麼我不得不把參數放在那一??它看起來像Web.Api行爲不同,當它只是一個參數而不是一個複雜的對象? – Boone