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




json ماهو (20)

يعمل 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"));

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

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

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

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

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


JSON:

يتم إنشاء البيانات ديناميكيًا وفقًا لمعلمات طلب البحث التي تم تمريرها في عنوان URL.

مثال:

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

نوع المحتوى: application/json

JSON-P:

JSON مع الحشو. الاستجابة هي بيانات JSON ، مع استدعاء دالة ملفوفة حولها.

مثال:

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

نوع المحتوى: 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),

إذا كنت تحصل على بيانات من 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

إذا كنت تستخدم Ubuntu أو Debian وكنت تخدم .json الملفات من خلال Apache ، فقد ترغب في عرض الملفات بنوع المحتوى الصحيح. أفعل هذا في المقام الأول لأنني أريد استخدام ملحق Firefox JSONView

mod_mime وحدة Apache mod_mime في القيام بذلك بسهولة. ومع ذلك ، باستخدام Ubuntu تحتاج إلى تحرير الملف /etc/mime.types وإضافة السطر

application/json json

ثم أعد تشغيل Apache:

sudo service apache2 restart

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

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


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

 Content-Type: application/json

هذا موضح في مقترح IETF's JSON Data Interchange Format 7158 ، القسم 1.2: مواصفات 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 في سياق REST ...

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

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

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

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


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

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

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


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


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

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

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

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



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

لكن

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

text/html

application/javascript

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


وبالطبع ، فإن نوع الوسائط 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);
    }
};

يجب تعيين رأس 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");

يقول تسجيل 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/json أو text/javascript . لكن بعض الأسماء الكبيرة حتى تستخدم text/plain .

والأكثر غرابة هو رأس Content-Type الذي يتم إرساله بواسطة Flickr ، والذي يعرض JSON على هيئة text/xml . تستخدم Google text/javascript لبعض من it aax 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


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 مُسجلاً رسميًا.





content-type