Câu hỏi Loại nội dung JSON chính xác là gì?


Tôi đã rối tung với JSON một thời gian, chỉ cần đẩy nó ra như văn bản và nó đã không làm tổn thương bất cứ ai (mà tôi biết), nhưng tôi muốn bắt đầu làm việc đúng cách.

tôi đa tưng thây vì thế nhiều "tiêu chuẩn" được nhắm mục tiêu cho loại nội dung JSON:

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

Nhưng đó là chính xác, hoặc tốt nhất? Tôi thu thập rằng có vấn đề về bảo mật và hỗ trợ trình duyệt khác nhau giữa chúng.

Tôi biết có một câu hỏi tương tự, Loại MIME nào nếu JSON đang được API REST trả về?, nhưng tôi muốn một câu trả lời được nhắm mục tiêu nhiều hơn một chút.


9201
2018-01-25 15:25


gốc




Các câu trả lời:


Đối với văn bản JSON:

application/json

Loại phương tiện MIME cho văn bản JSON là application/json. Mã hóa mặc định là UTF-8. (Nguồn: RFC 4627).

Dành cho JSONP (javascript chạy được) với gọi lại:

application/javascript

Dưới đây là một số bài đăng trên blog được đề cập trong các nhận xét có liên quan.


9176
2018-01-25 15:27



Hoàn thành danh sách các loại MIME - Eugen Mihailescu
Tôi có thể gửi tập tin cùng với văn bản Json không? - OPV
nó có thực sự quan trọng không? đó là văn bản được phân tích cú pháp thành một đối tượng. sẽ không tự nhiên hơn khi truyền nó thành văn bản / đồng bằng nếu bạn muốn nó có thể mở được trong trình duyệt mà không tải xuống lực và ứng dụng / octet-stream nếu bạn muốn nó được tải xuống tự động (hữu ích nếu bạn đang tạo nó trên một trang web dự định được lưu cục bộ). Có thực sự là nhiều người sẽ cần phải biết loại mime để downloader có thể xem nó với một người xem json đặc biệt? Tôi đang thiếu gì để đảm bảo nó là một loại mime đặc biệt? - Dmitry
Sử dụng "văn bản / đồng bằng" là một thực hành không tốt nói chung. Có, ví dụ, các cuộc tấn công trong nền tảng web mà sẽ cho phép trộm cắp dữ liệu gốc có nguồn gốc nếu bạn không gửi một giá trị kiểu MIME thích hợp. - EricLaw
Đôi khi Internet Explorer gặp sự cố với ứng dụng / json - blog đang ngoại tuyến - codetoshare


IANA đã đăng ký loại MIME chính thức cho JSON là application/json.

Khi được hỏi về lý do tại sao không text/json, Crockford có vẻ đã nói JSON không thực sự là JavaScript hay văn bản và IANA cũng có nhiều khả năng phát application/* hơn text/*.

Nhiêu tai nguyên hơn:


1473
2018-04-07 04:32



Rất nhiều thứ đã được đưa vào text/* trong những ngày đầu có lẽ sẽ được đưa vào application/* phần những ngày này. - TRiG
Và đó là một sai lầm lớn. JSON là văn bản. Có thể được đọc / ghi bởi bất kỳ trình soạn thảo văn bản nào. Điều đó có giá trị để biết, nhưng không thể bắt nguồn từ application/json. Tôi nghĩ rằng nó sẽ là tuyệt vời để có tất cả mọi thứ có thể được mở ra với một trình soạn thảo văn bản theo text, các tài liệu XML cụ thể trong text/xml/xhtml vv ... Nó thực sự đã giúp tổ chức. - Stijn de Witt
Tôi có thể mở .jpg trong trình soạn thảo văn bản của tôi. - Rohmer
@Rohmer - Bạn "có thể" mở bất kỳ thứ gì trong trình chỉnh sửa văn bản, nhưng định dạng nhị phân như JPEG hoặc Windows .exe hoặc .zip sẽ chứa các ký tự không thể in thực sự có thể phá vỡ nhiều trình chỉnh sửa văn bản hoặc gây ra hành vi không mong muốn. Thử chạy cat file.jpg ví dụ. Trong khi bất kỳ tệp xml hoặc json nào cũng có thể in được 100%. Vì vậy, tôi nghĩ điểm của Stijn de Witt là một điểm hợp lệ, mặc dù thực tế là có, đã quá muộn để thay đổi ngay bây giờ. - XP84
@ XP84 Bạn có thể mở bất kỳ nhị phân nào bằng trình soạn thảo văn bản ở dạng HEX. Và tất cả các nhân vật khác nhau (16 trong số đó) đều có thể in được 100%. Vì vậy, bởi logic đó ... tất cả đều là văn bản nhị phân?  Json không phải là văn bản. Json là (cảnh báo: định nghĩa không chính thức trước) một biểu diễn văn bản của một đối tượng (hoặc một mảng các đối tượng) - xDaizu


Đối với JSON:

Content-Type: application/json

Dành cho JSON-P:

Content-Type: application/javascript

786
2018-06-20 03:10



JSONP không thực sự là JSON, nó là một kỹ thuật để truyền một đối tượng JavaScript theo nghĩa đen - Benjamin Gruenbaum


Tất nhiên, loại phương tiện MIME chính xác cho JSON là application/jsonnhưng cần phải nhận ra loại dữ liệu nào được mong đợi trong ứng dụng của bạn.

Ví dụ, tôi sử dụng Mở rộng GWT và phản hồi của máy chủ phải text / html nhưng chứa dữ liệu JSON.

Phía máy khách, trình lắng nghe biểu mẫu 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");
    }
});

Trong trường hợp sử dụng ứng dụng / json loại phản hồi, trình duyệt đề xuất tôi lưu tệp.

Đoạn mã nguồn phía máy chủ sử dụng 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);
    }
};

584
2017-10-07 14:35



phản hồi của máy chủ phải là văn bản / html. Điều này cũng đúng với biến thể ExtJS. - gbegley


JSON:

Phản hồi là dữ liệu được tạo động, theo thông số truy vấn được truyền trong URL.

Thí dụ:

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

Loại nội dung:  application/json


JSON-P:

JSON có đệm. Phản hồi là dữ liệu JSON, với một cuộc gọi hàm bao quanh nó.

Thí dụ:

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

Loại nội dung:  application/javascript


427
2018-03-28 07:54



Làm thế nào điều này có ít phiếu hơn so với câu trả lời ở trên, nó hoàn chỉnh hơn và chứa các định nghĩa .. - Daniel Waters
@DanielWaters Định nghĩa của JSON là sai. Nó không cần phải được tạo động hoặc tham chiếu các tham số truy vấn. Bạn có thể phục vụ tệp JSON tĩnh. Ngoài ra, câu trả lời được trả lời nhiều nhất có liên kết tới RFC. - styfle
Ngoài ra JSONP có thể là dữ liệu json được gán cho một var. - Jimmy Kane


Nếu bạn đang sử dụng Ubuntu hoặc Debian và bạn phục vụ các tệp .json thông qua Apache, bạn có thể muốn phân phát các tệp có loại nội dung chính xác. Tôi đang làm điều này chủ yếu bởi vì tôi muốn sử dụng phần mở rộng của Firefox JSONView

Mô-đun Apache mod_mime sẽ giúp làm điều này dễ dàng. Tuy nhiên, với Ubuntu bạn cần chỉnh sửa tệp /etc/mime.types và thêm dòng

application/json json

Sau đó khởi động lại Apache:

sudo service apache2 restart

372
2017-11-16 22:58



thường tải lại là đủ (nhanh hơn khởi động lại). Ngoài ra, lưu ý rằng bây giờ bạn có thể làm "tải lại dịch vụ sudo apache2". - noamtm
Ubuntu 12.04 có điều này theo mặc định - Prizoff


Nếu bạn đang gọi ASP.NET Web Services từ phía máy khách, bạn phải sử dụng application/json để nó hoạt động. Tôi tin rằng điều này cũng tương tự đối với jQuery và Ext khuôn khổ.


361
2018-01-25 15:31



jQuery dường như làm việc với ít nhất là 'ứng dụng / json' và 'văn bản / đồng bằng' ... Tôi đã không thử tất cả những người khác mặc dù. - Nathan
jQuery có khả năng làm việc với content-Type: text/plain, content-Type: application/json, content-Type: application/json; charset=UTF-8, contentType: "application/x-www-form-urlencoded; charset=UTF-8" - Ashraf.Shk786


Loại nội dung phù hợp cho JSON là application/jsonUNLESS bạn đang sử dụng JSONP, còn được gọi là JSON với Padding, thực sự là JavaScript và vì vậy loại nội dung phù hợp sẽ là application/javascript.


287
2018-04-12 04:00





Không có nghi ngờ rằng application/json là tốt nhất MIME gõ cho một phản ứng JSON.

Nhưng tôi đã có một số kinh nghiệm mà tôi phải sử dụng application/x-javascript vì một số vấn đề về nén. Môi trường lưu trữ của tôi được chia sẻ lưu trữ với Cố lên bố. Chúng không cho phép tôi thay đổi cấu hình máy chủ. Tôi đã thêm mã sau vào web.config tệp để nén phản hồi.

<httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>

Bằng cách sử dụng điều này, các trang .aspx được nén bằng g-zip nhưng các phản hồi JSON thì không. Tôi đã thêm

<add mimeType="application/json" enabled="true"/>

trong các phần loại tĩnh và động. Nhưng điều này không nén phản ứng JSON cả.

Sau đó, tôi đã xóa loại mới được thêm và thêm vào

<add mimeType="application/x-javascript" enabled="true"/>

trong cả phần loại tĩnh và động và đã thay đổi loại phản hồi trong

.ashx (bộ xử lý không đồng bộ) cho

application/x-javascript

Và bây giờ tôi thấy rằng các câu trả lời JSON của tôi đã được nén bằng g-zip. Vì vậy, cá nhân tôi khuyên bạn nên sử dụng

application/x-javascript

chỉ khi bạn muốn nén phản hồi JSON của mình trên môi trường lưu trữ được chia sẻ. Bởi vì trong chia sẻ lưu trữ, họ không cho phép bạn thay đổi IIS cấu hình.


277
2018-04-18 08:22



"Vì vậy, cá nhân tôi đề xuất sử dụng ứng dụng / x-javascript" là nơi câu trả lời này trở nên gây hiểu nhầm. Cố lên bố làm cho phép nén application/json, Tôi tận dụng nó trên lưu trữ được chia sẻ của tôi và tôi sẽ không đề nghị sử dụng một loại nội dung khác nhau để cho phép nén anyway, nó chỉ đơn giản là sai. Nó có thể được thực hiện, nhưng nó vẫn sẽ sai. Sử dụng các loại nội dung khác nhau cho hỗ trợ trình duyệt là một điều, sử dụng các loại nội dung khác nhau để nén phía máy chủ là một loại khác. - Lady Bird


Chỉ khi sử dụng application/json như MIME tôi có những điều sau (kể từ tháng 11 năm 2011 với các phiên bản mới nhất của Chrome, Firefox với Firebug):

  • Không còn cảnh báo nào từ Chrome khi JSON được tải từ máy chủ.
  • Firebug sẽ thêm một tab vào phản hồi cho bạn thấy dữ liệu JSON được định dạng. Nếu loại MIME khác, nó sẽ chỉ hiển thị như 'Nội dung phản hồi'.

252
2017-11-30 06:42





Không phải mọi thứ đều hoạt động đối với loại nội dung application/json.

Nếu bạn đang sử dụng Ext JS biểu mẫu gửi tệp tải lên, lưu ý rằng phản hồi của máy chủ được phân tích bởi trình duyệt để tạo tài liệu cho <iframe>.

Nếu máy chủ đang sử dụng JSON để gửi đối tượng trả về, thì Content-Type tiêu đề phải được đặt thành text/html để yêu cầu trình duyệt chèn văn bản không thay đổi vào phần thân tài liệu.

Xem tài liệu API Ext JS 3.4.0.


229
2017-09-07 02:41



Các công cụ không tuân thủ các tiêu chuẩn nên tránh bất cứ khi nào có thể; sử dụng application/json mỗi thông số kỹ thuật. - one.beat.consumer
@ one.beat.consumer trong khi đó là sự thật, nó không cụ thể cho ExtJs mỗi se. Đó là giới hạn trình duyệt (hay đúng hơn, có lẽ là "biện pháp bảo mật"). - Hendy Irawan
Chắc chắn sẽ tốt hơn khi sử dụng văn bản / đồng bằng để nó không áp dụng bất kỳ ngữ nghĩa HTML nào cho nội dung không phải HTML? Hay các trình duyệt không cho phép bạn trích xuất nội dung của khung nếu nó không có DOM? - Synchro
Để thêm nhầm lẫn hơn nữa: Tôi chỉ gỡ lỗi một trường hợp tương tự trên Samsung Galaxy Beam (Android 2.3) bằng trình duyệt mặc định và iframe dường như cháy load sự kiện cho application/javascript, application/x-javascript, text/javascript, text/plain, nhưng KHÔNG PHẢI bắn nó cho application/json cũng không text/html. Tính đến hôm nay, Android <= 2.3 là khoảng 50% thị phần Android. - jakub.g