type - 什麼是正確的JSON內容類型?




response set json (20)

我一直在搞JSON一段時間,只是把它作為文本推出它並沒有傷害任何人(我知道),但我想開始正確地做事。

我已經看到了許多聲稱的JSON內容類型的“標準”:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

但哪個是正確的,還是最好的? 我認為它們之間存在安全性和瀏覽器支持問題。

我知道有一個類似的問題, 如果REST API返回JSON那麼MIME類型是什麼? ,但我想要一個稍微有針對性的答案。


application/json在PHP中非常適用於存儲數組或對像數據。

我使用此代碼將數據放在Google Cloud Storage(GCS)上的JSON中,該數據可以公開查看 :

$context = stream_context_create([
    'gs' => [
        'acl'=>'public-read', 
        'Content-Type' => 'application/json',
    ]
]);

file_put_contents(
    "gs://BUCKETNAME/FILENAME.json", 
    json_encode((object) $array), 
    false, 
    $context
);

要直接獲取數據:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));

JSON:

響應是動態生成的數據,根據URL中傳遞的查詢參數。

例:

{ "Name": "Foo", "Id": 1234, "Rank": 7 }

Content-Type: application/json

JSON-P:

帶填充的JSON。 響應是JSON數據,其中包含一個函數調用。

例:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

內容類型: application/javascript


JSON是一種特定域的語言 (DSL)和一種獨立於JavaScript的數據格式,因此具有自己的MIME類型application/json 。 尊重MIME類型當然是客戶端驅動的,因此text/plain可以用於傳輸字節,但是你會不必要地將解釋推送到供應商應用程序域 - application/json 。 你會通過text/plain傳輸XML嗎?

但老實說,你對MIME類型的選擇是建議客戶端如何解釋數據text/plain text/HTMLtext/HTML (當它不是HTML時)就像類型擦除一樣 - 它就像製作所有類型為Object的對像一樣無法提供信息用打字語言。

我所知道的瀏覽器運行時沒有採用JSON文檔並自動將其作為JavaScript可訪問對象提供給運行時而無需干預,但如果您正在使用殘缺客戶端,那就完全不同了。 但這不是整個故事 - RESTful JSON服務通常沒有JavaScript運行時,但它並沒有阻止它們使用JSON作為可行的數據交換格式。 如果客戶端癱瘓......那麼我會考慮通過Ajax模板服務來注入HTML。

應用程序/ JSON!


JSON的正確內容類型是application/json除非你正在使用JSONP ,也稱為帶有Padding的JSON,它實際上是JavaScript,所以正確的內容類型是application/javascript



JSON (JavaScript Object Notation)和JSONP (“帶有填充的JSON”)格式似乎非常相似,因此它們應該使用哪種MIME類型可能會非常混亂。 即使格式看起來非常相似,但它們之間存在一些細微差別。

因此,無論什麼時候懷疑,我都有非常簡單的方法(在大多數情況下都可以很好地找到),即去檢查相應的RFC文檔。

JSON RFC 4627 (JavaScript對象表示法的應用程序/ json媒體類型(JSON))是JSON格式的規範。 它在第6節中說,JSON文本的MIME媒體類型是

application/json.

在瀏覽器中, JSONP JSONP(“帶填充的JSON”)的處理方式與JSON不同。 JSONP被視為常規JavaScript腳本,因此它應該使用application/javascript,這是JavaScript的當前官方MIME類型。 但是,在許多情況下, text/javascript MIME類型也可以正常工作。

請注意, rfc-editor.org/rfc/rfc4329.txt (腳本媒體類型)文檔已將text/javascript標記為已過時,建議使用application/javascript類型。 但是,由於遺留原因, text/javascript仍然被廣泛使用,並且它具有跨瀏覽器支持(對於application/javascript MIME類型並不總是如此,特別是對於舊版瀏覽器)。


對於JSON:

Content-Type: application/json

對於JSONP

Content-Type: application/javascript

並非所有內容都適用於內容類型application/json

如果您使用Ext JS表單提交上傳文件,請注意瀏覽器會解析服務器響應以創建<iframe>的文檔。

如果服務器使用JSON發送返回對象,則必須將Content-Type標頭設置為text/html ,以告知瀏覽器將文本未更改地插入到文檔正文中。

請參閱Ext JS 3.4.0 API文檔


JSP ,您可以在page指令中使用它:

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>

JSON的正確MIME媒體類型是application/json 。 JSP將使用它向客戶端發送響應。


Spring您有一個已定義的類型: MediaType.APPLICATION_JSON_VALUE ,它等同於application / json


如果JSON帶有填充,那麼它將是application/jsonp 。 如果JSON沒有填充,那麼它將是application/json

要處理這兩個問題,最好使用:'application / javascript',而不用擔心是填充還是填充。


如果從JSON中的REST API獲取數據,則必須使用content-type

For JSON data: Content-Type:application/json
For HTML data: Content-Type:text/html,
For XHTML data: Content-Type:application/xhtml+xml,
For XML data: Content-Type:text/xml, application/xml

如果您從客戶端調用ASP.NET Web服務,則必須使用application/json才能工作。 我相信jQueryExt框架也是如此。


如果您處於客戶端環境中,那麼對於支持良好的Web應用程序,必須調查跨瀏覽器支持。

正確的HTTP Content-Type將是application/json ,因為其他人已經突出顯示,但是有些客戶端沒有很好地處理它,這就是jQuery推薦默認text/html



我用下面的

contentType: 'application/json',
data: JSON.stringify(SendData),

正確的MIME類型是application/json

我遇到過瀏覽器類型或框架用戶需要的許多情況:

text/html

application/javascript

正確答案是:

Content-Type: application/json

申請的IANA註冊application/json

使用此媒體類型的應用程序:JSON已用於在使用所有這些編程語言編寫的應用程序之間交換數據:ActionScript,C,C#,Clojure,ColdFusion,Common Lisp,E,Erlang,Go,Java,JavaScript,Lua,Objective CAML,Perl,PHP,Python,Rebol,Ruby,Scala和Scheme。

您會注意到IANA.org 沒有列出任何其他媒體類型 ,事實上甚至application/javascript現已過時。 所以application/json確實是唯一正確的答案。

瀏覽器支持是另一回事。

支持最廣泛的非標準媒體類型是text/jsontext/javascript 。 但是一些大牌甚至使用text/plain

更奇怪的是Flickr發送的Content-Type標頭,它將JSON作為text/xml返回。 谷歌使用text/javascript的一些ajax apis。

例子:

curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"

輸出: Content-Type: text/javascript

curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"

輸出: Content-Type: text/xml


當然,JSON的正確MIME媒體類型是application/json ,但是有必要實現應用程序中預期的數據類型。

例如,我使用Ext GWT ,服務器響應必須作為text / html但包含JSON數據。

客戶端,Ext GWT表單監聽器

uploadForm.getForm().addListener(new FormListenerAdapter()
{
    @Override
    public void onActionFailed(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Error");
    }

    @Override
    public void onActionComplete(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Success");
    }
});

如果使用application / json響應類型,瀏覽器建議我保存文件。

使用Spring MVC的服務器端源代碼片段

return new AbstractUrlBasedView() 
{
    @SuppressWarnings("unchecked")
    @Override
    protected void renderMergedOutputModel(Map model, HttpServletRequest request,
                                           HttpServletResponse response) throws Exception 
    {
        response.setContentType("text/html");
        response.getWriter().write(json);
    }
};




content-type