2011-10-09 110 views
2

我有一個jQuery ajax函數在調用失敗時用HTML響應。如果調用成功,它JSON響應:{"result":true}有一個ajax根據其成功返回JSON或HTML是不是很好?

$.ajax({ 
     type: 'POST', 
     dataType: 'html', 
     success: function (response) { 
      if (response.RESULT === true) { 
       window.location.replace(baseUrl); 
      } // else do something else and show errors 
     } 
    }); 

Firefox將不能識別的結果JSON,但是,由於數據類型設置爲「HTML」。我試圖把它留空,而這沒有奏效。有沒有解決辦法,還是返回兩件事情不好?

這是一個註冊表格。我返回HTML是因爲它更容易顯示用戶驗證(服務器端)錯誤,而如果註冊成功,我將它們重定向。

回答

6

我認爲一個AJAX調用應該總是以相同的格式返回數據。只有在呼叫失敗的情況下才返回HTML是不好的做法。您可以隨時返回與狀態參數的JSON響應,可以是成功錯誤內容參數這是HTML的響應。

4

這是一個不好的做法,雖然不是世界的盡頭。我寧願把它稱爲「黑客」。請求的狀態應基於響應代碼(200-確定,40x內容錯誤,50x服務器錯誤)。

5

返回兩種不同格式的數據是不好的做法。該服務的消費者不會知道會發生什麼,這也是不好的做法來改變整個一組相關服務的格式(雖然有些特殊的情況下證明它)

你的情況:

你能而不是做的是返回JSON所有的時間,並在錯誤的情況下,以這種格式返回JSON:

{ 
    "errorsHtml" : "<div class='errors'>...</div>" 
} 

而且你還可以利用HTTP狀態代碼頭,以表示服務器的狀態,例如狀態500是服務器內部錯誤。您可以處理不同的狀態代碼是這樣的:

$.ajax({ 
    statusCode: { 
    404: function() { 
     alert('page not found'); 
    } 
    } 
}); 
2

不要指定數據類型 -
如果沒有指定,jQuery將嘗試基於MIME類型的響應來推斷它

指定多個值是罰款並允許 -
多個以空格分隔的值:從jQuery 1.5開始,jQuery可以將ContentType類型頭中的數據類型轉換爲您所需的數據類型。例如,如果您希望將文本響應視爲XML,請將「text xml」用於dataType。

$.ajax({ 
    type: 'POST' 
    dataType: 'html json', 
    success: function (response) { 
     if (response.RESULT === true) { 
      window.location.replace(baseUrl); 
     } // else do something else and show errors 
    } 
}); 

http://api.jquery.com/jQuery.ajax/ - 檢查數據類型說明。

+0

這並不意味着服務器會返回爲所欲爲 - 在你的情況下,返回的數據將被轉換成JSON即使它在HTML中,當服務器實際返回一次HTML中的HTML和另一種情況下的json – Zasz

+0

肯定不會表示服務器可以返回任何內容,但它仍然沒有問題。 – Jayendra

+0

您編輯了您的答案,並告訴jquery將json轉換爲html,換句話說,即使內容類型爲text/html,jquery也會將其視爲json數據。好,現在當服務器返回json和客戶端也需要json時,會發生什麼情況?不過感謝分享,我不知道jQuery中存在這樣的功能 – Zasz

2

好的做法是返回請求的數據類型。就這麼簡單。發送數據不一致可能適用於短期,但如果您忘記了爲什麼您決定在一種情況下返回JSON而另一種情況下是HTML,那麼最終會出現長期可維護性問題。

請求數據的方式很多,我個人最喜歡的是一個RESTful請求實現。實現RESTful系統有很多方法。

如果你要做出www.example.com/cars你可能會得到汽車的列表的請求,但有服務器沒有什麼好辦法知道如何你想格式化小汽車的名單。

一個簡單的方法來指定你想要的是添加一個後綴:www.example.com/cars?type=HTML可能足以描述足以通知服務器你想要什麼類型的數據&hellip;

如果有辦法指定您希望從服務器接收的數據類型而不是污染查詢字符串會不會很方便?

事實證明有一種方法&hellip;文件擴展名:www.example.com/cars.html對於應該返回什麼類型的數據非常具體,並且在您需要追蹤該錯誤時您不會在6個月內感到困惑,因爲您會知道客戶端請求是期望 HTML。

www.example.com/cars.jswww.example.com/cars.json可以返回不同類型的數據,您永遠不會對請求應該返回給客戶端的內容感到困惑。

使用RESTful實現的最佳部分是,您可以將請求錯誤作爲HTTP狀態代碼提出。格式錯誤的請求?發出400錯誤。權限不正確?發出403

將錯誤處理程序綁定到AJAX請求,並且您將能夠輕鬆區分返回的「成功」JSON和「錯誤」JSON。

如果你真的希望在JSON預計HTML,只是JSON編碼它的對象爲{"error":"your html <strong>here</strong>"}

相關問題