content-type - ما هو نوع محتوى JSON الصحيح؟




(25)

لقد كنت أتعبث مع JSON لبعض الوقت ، فقط قم بدفعه كنص ، ولم يضر أي شخص (أعرفه) ، لكنني أود أن أبدأ في فعل الأشياء بشكل صحيح.

لقد رأيت الكثير من "المعايير" المزعومة لنوع محتوى JSON:

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

لكن أيهما صحيح أم أفضل؟ أجمع أن هناك مشكلات في دعم الأمان والمتصفح تتفاوت فيما بينها.

أعلم أن هناك سؤالًا مشابهًا ، ما نوع MIME إذا تم إرجاع JSON بواسطة واجهة برمجة تطبيقات REST؟ ، لكني أرغب في الحصول على إجابة أكثر تحديدًا.


Answers

لقد سجلت IANA نوع MIME الرسمي لـ JSON application/json .

عندما سئل عن سبب عدم ظهور text/json ، يبدو أن Crockford قد قال أن JSON ليس جافا text/json ولا text/json ، وكذلك IANA كان من المرجح أن تقدم application/* من text/* .

المزيد من الموارد:


وبالطبع ، فإن نوع الوسائط MIME الصحيح لـ JSON هو application/json ، ولكن من الضروري application/json نوع البيانات المتوقع في التطبيق الخاص بك.

على سبيل المثال ، يمكنني استخدام Ext GWT ويجب أن تكون استجابة الخادم بتنسيق text / html ولكنها تحتوي على بيانات JSON.

جانب العميل ، المستمع شكل 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");
    }
});

في حالة استخدام نوع استجابة التطبيق / 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);
    }
};

في Spring لديك نوع محدد: MediaType.APPLICATION_JSON_VALUE وهو ما يعادل التطبيق / json .


بالنسبة إلى JSON ، أستخدم:

 Content-Type: application/json

هذا موضح في مقترح IETF's JSON Data Interchange Format 7158 ، القسم 1.2: مواصفات JSON .


نوع MIME الصحيح هو application/json

لكن

لقد واجهت العديد من المواقف التي يحتاج فيها نوع المتصفح أو مستخدم الإطار إلى:

text/html

application/javascript

إذا كنت تحصل على بيانات من REST API في JSON ، فيجب عليك استخدام نوع المحتوى

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

بالنسبة إلى نص JSON:

application/json

نوع وسائط MIME للنص JSON هو application/json . الترميز الافتراضي هو UTF-8. (المصدر: RFC 4627 ).

بالنسبة لـ JSONP (javascript runnable) مع معاودة الاتصال:

application/javascript

في ما يلي بعض مشاركات المدونة التي تم ذكرها في التعليقات ذات الصلة.


يعمل application/json بشكل رائع في PHP لتخزين بيانات صفيف أو كائن.

أستخدم هذا الرمز لوضع البيانات في JSON على Google Cloud Storage (GCS) والتي تم تعيينها للعرض العام :

$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"));

في JSP ، يمكنك استخدام هذا في توجيه الصفحة:

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

نوع الوسائط MIME الصحيح لـ JSON هو application/json . ستستخدم JSP ذلك لإرسال استجابة إلى العميل.


" application/json " هو نوع محتوى JSON الصحيح.

def ajaxFindSystems = {
  def result = Systems.list()
  render(contentType:'application/json') {
    results {
      result.each{sys->
        system(id:sys.id, name:sys.name)
      }
    }
    resultset (rows:result.size())
  }
}

Content-type: application/json - json
Content-Type: application/javascript - json-P
Content-type: application/x-javascript - javascript
Content-type: text/javascript - javascript BUT مهملة ، إصدارات IE القديمة المستخدمة لاستخدامها كسمات html.
Content-type: text/x-javascript - أنواع وسائط JavaScript غير صالحة للاستخدام
Content-type: text/x-json - json before application / json مُسجلاً رسميًا.


لا يعمل كل شيء من أجل application/json نوع المحتوى application/json .

إذا كنت تستخدم تطبيق Ext JS إرسال إلى ملف التحميل ، فكن على دراية بأن استجابة الخادم يتم تحليلها بواسطة المتصفح لإنشاء المستند لـ <iframe> .

إذا كان الخادم يستخدم JSON لإرسال كائن الإرجاع ، فيجب تعيين عنوان Content-Type على text/html لإخبار المتصفح بإدراج النص بدون تغيير في نص المستند.

راجع وثائق واجهة برمجة التطبيقات Ext JS 3.4.0 .


إذا كنت في بيئة من جانب العميل ، فإن البحث عن الدعم عبر المستعرض أمر إلزامي لتطبيق ويب مدعوم بشكل جيد.

سيكون نوع محتوى HTTP الصحيح هو application/json ، كما هو الحال مع الآخرين بالفعل ، ولكن بعض العملاء لا يتعاملون معه بشكل جيد ، وهذا هو السبب في أن jQuery يوصي text/html الافتراضي.


توسيع الاستجابات المقبولة ، عندما تستخدم JSON في سياق REST ...

توجد حجة قوية حول استخدام application/x-resource+json application/x-collection+json عندما تمثل موارد ومجموعات REST.

وإذا قررت اتباع مواصفات jsonapi ، فيجب عليك استخدام application/vnd.api+json ، كما هو موثق.

على الرغم من عدم وجود معيار عالمي ، فمن الواضح أن الدلالة المضافة إلى الموارد التي يتم نقلها تبرر نوع محتوى أكثر وضوحا من مجرد application/json .

بعد هذا المنطق ، يمكن لسياقات أخرى تبرير نوع محتوى أكثر تحديدًا.


يجب تعيين رأس Content-Type على " application / json " عند النشر. يجب أن يتضمن الخادم الذي يستمع للطلب " Accept = application / json ". في الربيع MVC يمكنك القيام بذلك على النحو التالي:

@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")

إضافة رؤوس إلى الاستجابة:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");

تبدو تنسيقات JSON (تدوين كائن جافا سكريبت) و JSONP ("JSON مع الحشو") متشابهة جدًا ، ولذلك قد يكون من المربك جدًا نوع MIME الذي يجب استخدامه. على الرغم من أن التنسيقات تبدو متشابهة للغاية ، إلا أن هناك بعض الاختلافات الطفيفة بينهما.

لذلك ، كلما كان لدي أي شكوك ، لدي أسلوب بسيط للغاية (يعمل بشكل مثالي في معظم الحالات) ، أي اذهب إلى فحص مستند RFC المقابل.

JSON RFC 4627 (نوع التطبيق / json للوسائط لترميز كائن JavaScript (JSON)) هو أحد مواصفات تنسيق JSON. تقول في القسم 6 ، أن نوع وسائط MIME للنص JSON هو

application/json.

يتم التعامل مع JSONP JSONP ("JSON with padding") بطريقة مختلفة عن JSON ، في المتصفح. يتم التعامل مع JSONP على أنه نص جافا سكريبت عادي ، ويجب عليه استخدام application/javascript, وهو نوع MIME الرسمي الحالي لجافا سكريبت. ومع ذلك ، في العديد من الحالات ، سيعمل نوع MIME text/javascript بشكل جيد أيضًا.

لاحظ أنه قد تم وضع علامة على text/javascript كملف قديم من قبل rfc-editor.org/rfc/rfc4329.txt (أنواع وسائط الوسائط النصية) ومن المستحسن استخدام نوع application/javascript بدلاً من ذلك. ومع ذلك ، نظرًا للأسباب القديمة ، لا يزال text/javascript مستخدمًا على نطاق واسع ولديه دعم عبر المتصفح (والذي لا يمثل دائمًا حالة مع نوع MIME application/javascript ، خاصة مع المتصفحات القديمة).


لـ JSON:

Content-Type: application/json

لـ JSONP :

Content-Type: application/javascript

إذا كنت تقوم بالاتصال بخدمات ASP.NET على ويب من جانب العميل ، فعليك استخدام application/json . أعتقد أن هذا هو الشيء نفسه بالنسبة إلى إطار عمل jQuery و Ext .


فقط عند استخدام application/json كنوع MIME لدي ما يلي (اعتبارًا من نوفمبر 2011 مع أحدث إصدارات Chrome ، فايرفوكس مع Firebug ):

  • لا مزيد من التحذيرات من Chrome عند تحميل JSON من الخادم.
  • سيضيف Firebug علامة تبويب إلى الاستجابة لتظهر لك بيانات JSON المنسقة. إذا كان نوع MIME مختلفًا ، فسيظهر فقط كـ "محتوى استجابة".

إذا كان JSON مع الحشو سيكون application/jsonp . إذا كان JSON بدون حشوة فسيكون application/json .

للتعامل مع كليهما ، من الممارسات الجيدة استخدام: "application / javascript" دون إزعاج ما إذا كان مع الحشو أو بدون الحشو.


نوع المحتوى الصحيح لـ JSON هو application/json الذي تستخدمه JSONP ، والمعروف أيضًا باسم JSON مع Padding ، والذي هو في الواقع JavaScript ، وبالتالي يكون نوع المحتوى الصحيح هو application/javascript .


JSON هي لغة خاصة بالنطاق (DSL) ونسق بيانات مستقل عن JavaScript ، application/json لها نوع MIME الخاص بها ، application/json . إن احترام أنواع MIME هو بالطبع مدفوعة من قبل العميل ، لذلك قد يقوم text/plain بنقل البايتات ، ولكنك ستقوم application/json الترجمة الفورية إلى مجال تطبيق البائع بدون داع - application/json . هل ستقوم بنقل XML عبر text/plain ؟

لكن بصراحة ، اختيارك لنوع MIME هو نصيحة للعميل فيما يتعلق بكيفية تفسير text/plain البيانات text/plain أو text/HTML (عندما لا يكون HTML) هو مثل محو الكتابة - إنه غير مدهش مثل جعل جميع الكائنات الخاصة بك من نوع الكائن بلغة مكتوبة.

لن يكون هناك وقت تشغيل للمتصفح الذي أعرف أنه سيتخذ مستند JSON ويجعله متاحًا تلقائيًا وقت التشغيل ككائن يمكن الوصول إليه من خلال JavaScript دون تدخل ، ولكن إذا كنت تعمل مع عميل معطل ، فهذه مسألة مختلفة تمامًا. ولكن هذه ليست القصة بأكملها - غالبًا لا تحتوي خدمات RESTful JSON على أوقات تشغيل جافا سكريبت ، ولكنها لا توقف استخدامها باستخدام JSON كصيغة تبادل بيانات قابلة للتطبيق. إذا كان العملاء مشلولين ... فحينئذٍ سوف أفكر في إدخال شفرة HTML عبر خدمة Ajax templating بدلاً من ذلك.

التطبيق / JSON!


أنا استخدم أدناه

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

يستخدم مطورو PHP هذا:

<?php
    header("Content-type: application/json");

    // Do something here...
?>

انها ليست بسيطة جدا مع طريقة الأم مع أدوات jq .

فمثلا:

cat xxx | jq .






json content-type