سؤال

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

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

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

ولكن أي واحد هو الصحيح أو الأفضل ؟ أظن أن هناك الأمن و دعم المتصفح قضايا متفاوتة بينهما.

أنا أعلم أن هناك سؤال مماثل ، ما نوع MIME إذا JSON يتم إرجاعها من قبل بقية API ؟ , ولكن أود قليلا أكثر استهدافا الإجابة.

هل كانت مفيدة؟

المحلول

عن سلمان النص:

application/json

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

بالنسبة JSONP (runnable جافا سكريبت) مع الاستدعاء:

application/javascript

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

نصائح أخرى

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

عندما سئل عن لماذا لا text/json, Crockford يبدو أن قال سلمان ليس جافا سكريبت ولا نص أيضا IANA كان أكثر عرضة من جهة application/* من text/*.

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

عن سلمان:

Content-Type: application/json

بالنسبة JSON-P:

Content-Type: application/javascript

بالطبع الصحيحة MIME نوع وسائط سلمان هو application/json, لكن من الضروري أن ندرك ما هو نوع البيانات المتوقع في التطبيق الخاص بك.

على سبيل المثال انا استخدم تحويلة GWT و استجابة الملقم يجب أن تذهب نص/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 استجابة نوع المتصفح يوحي لي حفظ الملف.

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

سلمان:

رد ديناميكيا حسب استعلام المعلمات التي تم تمريرها في URL.

على سبيل المثال:

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

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


JSON-P:

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

على سبيل المثال:

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

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

إذا كنت تستخدم أوبونتو أو ديبيان و لك خدمة .ملفات json خلال أباتشي ، قد تريد أن تكون الملفات مع تصحيح نوع المحتوى.أنا أفعل هذا في المقام الأول لأنني أريد أن استخدم فايرفوكس التمديد JSONView

أباتشي وحدة mod_mime سوف تساعد على القيام بذلك بسهولة.ومع ذلك, مع أوبونتو تحتاج إلى تحرير الملف /etc/mime.أنواع وإضافة خط

application/json json

ثم إعادة تشغيل أباتشي:

sudo service apache2 restart

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

المحتوى المناسب لنوع سلمان هو application/json إلا إذا كنت تستخدم JSONP, ، المعروف أيضا باسم سلمان مع الحشو ، الذي هو في الواقع جافا سكريبت و حتى الحق في نوع المحتوى سيكون application/javascript.

ليس هناك شك في أن application/json هو أفضل MIME نوع سلمان الاستجابة.

ولكن لدي بعض الخبرة حيث اضطررت إلى استخدام application/x-javascript بسبب ضغط بعض القضايا.استضافة بيئة استضافة مشتركة مع GoDaddy.لا اسمحوا لي أن تغيير تكوينات ملقم.لدي إضافة التعليمات البرمجية التالية إلى بلدي web.config ملف لضغط الردود.

<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"/>

باستخدام هذا .صفحات aspx كان مضغوط مع g-zip ولكن سلمان الردود لم تكن.أضفت

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

في والدينامية أنواع أقسام. ولكن هذا لا ضغط سلمان الردود على الإطلاق.

بعد أن أزلت هذا المضافة حديثا نوع المضافة

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

في كل والدينامية أنواع المقاطع و تغير نوع الاستجابة في

.ashx (غير متزامن معالج) إلى

application/x-javascript

والآن وجدت أن بلدي سلمان الردود مضغوط مع g-الرمز البريدي.لذلك أنا شخصيا انصح استخدام

application/x-javascript

إلا إذا كنت ترغب في ضغط سلمان الردود على بيئة استضافة مشتركة.لأنه في استضافة مشتركة, أنها لا تسمح لك بتغيير IIS تكوينات.

فقط عند استخدام application/json كما MIME نوع لدي التالية (اعتبارا من تشرين الثاني / نوفمبر 2011 مع أحدث إصدارات كروم, فايرفوكس مع الحرائق):

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

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

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

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

انظر Ext JS 3.4.0 وثائق API.

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

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

لا وقت متصفح أعرف من سوف تأخذ سلمان الوثيقة تلقائيا جعلها متاحة وقت التشغيل مثل جافا سكريبت يمكن الوصول إليها الكائن دون تدخل ، ولكن إذا كنت تعمل مع شلت العميل, هذا هو مسألة مختلفة تماما.ولكن هذه ليست القصة بأكملها- راحة سلمان الخدمات في كثير من الأحيان لم يكن لديك جافا سكريبت أوقات التشغيل ، لكن لا توقف لهم باستخدام سلمان قابل تنسيق تبادل البيانات.إذا كان العملاء هي التي شلت...ثم أن النظر ربما HTML عن طريق الحقن اياكس النموذجيه الخدمة بدلا من ذلك.

Application/JSON!

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

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

الجواب الصحيح هو:

Content-Type: application/json

كما العديد من الآخرين المذكورة ، application/json هو الجواب الصحيح.

ولكن ما لم يتم تفسيره بعد ما الخيارات الأخرى اقترحت يعني.

  • application/x-javascript:التجريبية نوع MIME جافا سكريبت قبل application/javascript وقدم القياسية.

  • text/javascript:الآن عفا عليها الزمن.يجب عليك استخدام application/javascript عند استخدام جافا سكريبت.

  • text/x-javascript:التجريبية نوع MIME الحالة المذكورة أعلاه.

  • text/x-json:التجريبية نوع MIME سلمان قبل application/json حصلت مسجلة رسميا.

جميع في كل شيء ، كلما كان لديك أي شكوك حول أنواع المحتوى ، يجب أن تحقق هذا الرابط

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

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

الصحيح MIME نوع وسائط سلمان هو 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())
  }
}

على IANA التسجيل application/json يقول

التطبيقات التي تستخدم هذا نوع وسائل الإعلام:سلمان وقد استخدم تبادل البيانات بين التطبيقات المكتوبة في كل هذه لغات البرمجة:أكشن, C, C#, Clojure, كولد فيوجن ، Common Lisp, E, إرلانج, اذهب, جافا, جافا سكريبت, Lua, الهدف CAML, Perl, PHP, Python, Rebol, روبي, ميلان, و مخطط.

ستلاحظ أن IANA.org لا تسرد أي من هذه غيرها من أنواع وسائل الإعلام, في الواقع حتى application/javascript هو الآن عفا عليها الزمن.لذلك application/json هو حقا فقط ممكن الصحيح الجواب.

دعم المتصفح هو شيء آخر.

الأكثر على نطاق واسع بدعم غير القياسية أنواع وسائل الإعلام هي text/json أو text/javascript.ولكن بعض الأسماء الكبيرة حتى استخدام text/plain.

أكثر من الغريب هو نوع المحتوى رأس أرسلت من قبل فليكر ، الذي يعود JSON كما text/xml.تستخدم Google text/javascript بالنسبة لبعض انها اياكس واجهات برمجة التطبيقات.

أمثلة:

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

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

ولكن

لقد شهدت العديد من الحالات التي يكون فيها نوع المتصفح أو إطار المستخدم المطلوبة:

text/html

application/javascript

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

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

على نوع المحتوى ينبغي أن يكون رأس مجموعة 'application/json'عندما نشر.Server الاستماع يجب أن يتضمن الطلب "تقبل=application/json".في الربيع MVC يمكنك أن تفعل ذلك من هذا القبيل:

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

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

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

في الربيع لديك تعريف نوع: MediaType.APPLICATION_JSON_VALUE وهو ما يعادل application/json.

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

أنا استخدم هذا الرمز وضع البيانات في سلمان على جوجل سحابة التخزين (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"));

إذا كان سلمان مع الحشو ثم سيكون application/jsonp.إذا كان سلمان هو دون الحشو ثم سيكون application/json.

للتعامل مع كل من هو ممارسة جيدة لاستخدام:'التطبيق/javascript' دون عناء سواء كان مع الحشو أو بدون الحشو.

عن سلمان, أنا باستخدام:

 Content-Type: application/json

هذا هو موضح في IETF سلمان تنسيق تبادل البيانات 7158 الاقتراح ، القسم 1.2:مواصفات سلمان.

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

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

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

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

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

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

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

    // Do something here...
?>

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

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

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

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

application/json.

JSONP JSONP ("سلمان مع الحشو") يتم التعامل معها بطريقة مختلفة من سلمان في المتصفح.JSONP يعامل منتظم جافا سكريبت script وبالتالي فإنه يجب استخدام application/javascript, الرسمي الحالي MIME نوع جافا سكريبت.في كثير من الحالات, ومع ذلك ، text/javascript نوع MIME سوف تعمل بشكل جيد جدا.

علما بأن text/javascript تم وضع علامة كما عفا عليها الزمن من قبل RFC 4329 (البرمجة أنواع الوسائط) الوثيقة فمن المستحسن استخدام application/javascript نوع بدلا من ذلك.ومع ذلك ، بسبب إرث الأسباب ، text/javascript لا تزال تستخدم على نطاق واسع ولها الدعم عبر متصفح (التي ليست دائما الحالة مع application/javascript نوع MIME, خصوصا مع المتصفحات القديمة).

Content-Type: application/json - json
Content-Type: application/javascript - json-P
Content-Type: application/x-javascript - جافا سكريبت
Content-Type: text/javascript - جافا سكريبت ولكن عفا عليها الزمن ، أقدم إصدارات IE تستخدم html السمة.
Content-Type: text/x-javascript - سكريبت أنواع وسائل الإعلام ولكن عفا عليها الزمن
Content-Type: text/x-json - سلمان قبل application/json حصلت مسجلة رسميا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top