content-type - सही JSON सामग्री प्रकार क्या है?




(25)

मैं कुछ समय के लिए JSON के साथ गड़बड़ कर रहा हूं, बस इसे पाठ के रूप में धक्का दे रहा हूं और इससे किसी को भी चोट नहीं पहुंची है (जिसे मैं जानता हूं), लेकिन मैं चीजों को ठीक से शुरू करना चाहता हूं।

मैंने JSON सामग्री प्रकार के लिए बहुत से "मानकों" को देखा है :

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

लेकिन जो सही है, या सबसे अच्छा है? मैं इकट्ठा करता हूं कि सुरक्षा और ब्राउज़र समर्थन मुद्दे उनके बीच भिन्न हैं।

मुझे पता है कि एक समान सवाल है, क्या एमईएमई प्रकार अगर JSON को आरईएसटी एपीआई द्वारा वापस किया जा रहा है? , लेकिन मुझे थोड़ा अधिक लक्षित उत्तर चाहिए।


Answers

यदि आपको JSON में REST API से डेटा मिलता है तो आपको सामग्री-प्रकार का उपयोग करना होगा

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

Content-type: application/json - जेसन
Content-Type: application/javascript - जेसन-पी
Content-type: application/x-javascript - जावास्क्रिप्ट
Content-type: text/javascript - जावास्क्रिप्ट लेकिन अप्रचलित, पुराने आईई संस्करण HTML विशेषता के रूप में उपयोग करने के लिए उपयोग किया जाता है।
Content-type: text/x-javascript - जावास्क्रिप्ट मीडिया प्रकार लेकिन अप्रचलित
Content-type: text/x-json - आवेदन से पहले जेसन आधिकारिक तौर पर पंजीकृत हो गया।


सही एमआईएम प्रकार application/json

परंतु

मैंने कई परिस्थितियों का अनुभव किया जहां ब्राउज़र प्रकार या फ्रेमवर्क उपयोगकर्ता की आवश्यकता थी:

text/html

application/javascript

जैसा कि कई अन्य ने उल्लेख किया है, application/json सही जवाब है।

लेकिन अभी तक समझाया नहीं गया है कि आपके द्वारा प्रस्तावित अन्य विकल्पों का क्या अर्थ है।

  • application/x-javascript : application/javascript मानक से पहले जावास्क्रिप्ट के लिए प्रायोगिक एमआईएम प्रकार मानक बनाया गया था।

  • text/javascript : अब अप्रचलित। application/javascript का उपयोग करते समय आपको application/javascript उपयोग करना चाहिए।

  • text/x-javascript : उपर्युक्त स्थिति के लिए प्रायोगिक एमआईएम प्रकार।

  • text/x-json : application/json आधिकारिक तौर पर पंजीकृत होने से पहले JSON के लिए प्रायोगिक एमआईएम प्रकार।

सब कुछ, जब भी आपको सामग्री प्रकारों के बारे में कोई संदेह है, तो आपको यह लिंक देखना चाहिए


यदि आप उबंटू या डेबियन का उपयोग कर रहे हैं और आप अपाचे के माध्यम से .json फ़ाइलों की सेवा करते हैं, तो आप सही सामग्री प्रकार वाली फ़ाइलों को सेवा देना चाहेंगे। मैं इसे मुख्य रूप से कर रहा हूं क्योंकि मैं फ़ायरफ़ॉक्स एक्सटेंशन JSONView का उपयोग करना चाहता JSONView

अपाचे मॉड्यूल mod_mime इसे आसानी से करने में मदद करेगा। हालांकि, उबंटू के साथ आपको फ़ाइल /etc/mime.types को संपादित करने और लाइन जोड़ने की आवश्यकता है

application/json json

फिर अपाचे को पुनरारंभ करें:

sudo service apache2 restart

JSON के लिए:

Content-Type: application/json

JSONP :

Content-Type: application/javascript

बेशक, JSON के लिए सही MIME मीडिया प्रकार application/json , लेकिन यह जानना आवश्यक है कि आपके एप्लिकेशन में किस प्रकार का डेटा अपेक्षित है।

उदाहरण के लिए, मैं एक्स्ट जीडब्ल्यूटी का उपयोग करता हूं और सर्वर प्रतिक्रिया टेक्स्ट / एचटीएमएल के रूप में जाना चाहिए लेकिन इसमें JSON डेटा शामिल है।

ग्राहक पक्ष, अतिरिक्त जीडब्ल्यूटी फॉर्म श्रोता

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

एप्लिकेशन / जेसन प्रतिक्रिया प्रकार का उपयोग करने के मामले में, ब्राउज़र मुझे फ़ाइल को सहेजने का सुझाव देता है।

स्प्रिंग एमवीसी का उपयोग कर सर्वर साइड सोर्स कोड स्निपेट

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

JSON (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) और JSONP ("पैडिंग के साथ जेएसओएन") प्रारूप बहुत समान प्रतीत होते हैं और इसके लिए यह बहुत भ्रमित हो सकता है कि एमआईएमई प्रकार का उपयोग किस प्रकार किया जाना चाहिए। हालांकि प्रारूप बहुत समान प्रतीत होते हैं, उनके बीच कुछ सूक्ष्म मतभेद हैं।

इसलिए जब भी किसी भी संदेह में, मेरे पास बहुत ही सरल दृष्टिकोण है (जो ज्यादातर मामलों में पूरी तरह से काम करता है), अर्थात्, संबंधित आरएफसी दस्तावेज़ पर जाएं और जांचें।

जेएसओएन आरएफसी 4627 (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (जेएसओएन) के लिए एप्लिकेशन / जेसन मीडिया टाइप) जेएसओएन प्रारूप का एक विनिर्देश है। यह धारा 6 में कहता है कि जेएसओएन पाठ के लिए एमआईएम मीडिया प्रकार है

application/json.

JSONP JSONP ("पैडिंग के साथ JSON") को ब्राउज़र में JSON से अलग तरीके से संभाला जाता है। JSONP को नियमित जावास्क्रिप्ट स्क्रिप्ट के रूप में माना जाता है और इसके लिए इसे application/javascript, लिए वर्तमान आधिकारिक एमआईएम प्रकार application/javascript, उपयोग करना चाहिए। कई मामलों में, हालांकि, text/javascript एमआईएमई प्रकार भी ठीक काम करेगा।

ध्यान दें कि text/javascript को rfc-editor.org/rfc/rfc4329.txt (स्क्रिप्टिंग मीडिया प्रकार) दस्तावेज़ द्वारा अप्रचलित के रूप में चिह्नित किया गया है और इसकी बजाय application/javascript प्रकार का उपयोग करने की अनुशंसा की जाती है। हालांकि, विरासत कारणों से, text/javascript अभी भी व्यापक रूप से उपयोग किया जाता है और इसमें क्रॉस-ब्राउज़र समर्थन है (जो हमेशा application/javascript एमआईएम प्रकार के साथ मामला नहीं है, खासकर पुराने ब्राउज़र के साथ)।


एरे या ऑब्जेक्ट डेटा स्टोर करने के लिए application/json PHP में बहुत अच्छा काम करता है।

मैं Google क्लाउड स्टोरेज (जीसीएस) पर जेएसओएन में डेटा डालने के लिए इस कोड का उपयोग करता हूं जो सार्वजनिक रूप से देखने योग्य सेट है:

$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 का उपयोग कर रहे हैं ...

जब आप आरईएसटी संसाधनों और संग्रहों का प्रतिनिधित्व कर रहे हों तो application/x-resource+json और application/x-collection+json का उपयोग application/x-resource+json बारे में एक मजबूत तर्क है

और यदि आप jsonapi विनिर्देशों का पालन करने का निर्णय लेते हैं, तो आपको दस्तावेज़ application/vnd.api+json का उपयोग करना चाहिए , जैसा कि यह प्रलेखित है।

Altough एक सार्वभौमिक मानक नहीं है, यह स्पष्ट है कि संसाधनों के लिए जोड़ा गया अर्थात् हस्तांतरण केवल application/json तुलना में एक और स्पष्ट सामग्री प्रकार को न्यायसंगत साबित करता है।

इस तर्क के बाद, अन्य संदर्भ एक और विशिष्ट सामग्री-प्रकार को औचित्य साबित कर सकते हैं।


जेएसओएन एक डोमेन-विशिष्ट भाषा (डीएसएल) और जावास्क्रिप्ट से स्वतंत्र डेटा प्रारूप है, और इस तरह इसका अपना MIME प्रकार, application/json । एमआईएमई प्रकारों का सम्मान निश्चित रूप से क्लाइंट संचालित है, इसलिए text/plain बाइट्स के हस्तांतरण के लिए कर सकता है, लेकिन फिर आप विक्रेता एप्लिकेशन डोमेन को अनावश्यक रूप से - application/json व्याख्या को application/json । क्या आप text/plain माध्यम से एक्सएमएल स्थानांतरित करेंगे?

लेकिन ईमानदारी से, एमआईएमई प्रकार की आपकी पसंद क्लाइंट को सलाह है कि डेटा- text/plain या text/HTML (जब यह एचटीएमएल नहीं है) की व्याख्या कैसे करें, टाइप एरर की तरह है- यह आपके सभी ऑब्जेक्ट्स ऑब्जेक्ट बनाने के रूप में अनौपचारिक है एक टाइप की गई भाषा में।

मुझे पता नहीं है कि कोई ब्राउज़र रनटाइम एक JSON दस्तावेज़ नहीं लेगा और इसे बिना किसी हस्तक्षेप के जावास्क्रिप्ट सुलभ वस्तु के रूप में रनटाइम पर उपलब्ध कराएगा, लेकिन यदि आप एक अपंग ग्राहक के साथ काम कर रहे हैं, तो यह एक पूरी तरह से अलग बात है। लेकिन यह पूरी कहानी नहीं है- RESTful जेएसओएन सेवाओं में अक्सर जावास्क्रिप्ट रनटाइम नहीं होते हैं, लेकिन यह जेएसओएन का उपयोग व्यवहार्य डेटा इंटरचेंज प्रारूप के रूप में नहीं करता है। यदि ग्राहक अपंग हैं ... तो मैं इसके बजाय एक Ajax टेम्पलेटिंग सेवा के माध्यम से शायद HTML इंजेक्शन पर विचार करूंगा।

आवेदन / JSON!


Spring आपके पास एक परिभाषित प्रकार है: MediaType.APPLICATION_JSON_VALUE जो एप्लिकेशन / MediaType.APPLICATION_JSON_VALUE बराबर है।


JSP , आप इसे पृष्ठ निर्देश में उपयोग कर सकते हैं:

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

जेएसओएन के लिए सही MIME मीडिया प्रकार application/json । जेएसपी ग्राहक को प्रतिक्रिया भेजने के लिए इसका इस्तेमाल करेगा।


" 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())
  }
}

यदि आप क्लाइंट-साइड से एएसपी.NET वेब सेवाओं को कॉल कर रहे हैं तो आपको इसके लिए application/json का उपयोग करना होगा। मेरा मानना ​​है कि यह jQuery और Ext फ्रेमवर्क के लिए समान है।


JSON टेक्स्ट के लिए:

application/json

JSON टेक्स्ट के लिए MIME मीडिया प्रकार application/json । डिफ़ॉल्ट एन्कोडिंग यूटीएफ -8 है। (स्रोत: आरएफसी 4627 )।

कॉलबैक के साथ JSONP (चलने योग्य जावास्क्रिप्ट) के लिए:

application/javascript

यहां कुछ ब्लॉग पोस्ट हैं जिनका उल्लेख प्रासंगिक टिप्पणियों में किया गया था।


केवल MIME प्रकार के रूप में application/json का उपयोग करते समय मेरे पास निम्नलिखित है (नवंबर 2011 तक क्रोम के नवीनतम संस्करणों के साथ, फायरबग के साथ फ़ायरफ़ॉक्स):

  • जेएसओएन सर्वर से लोड होने पर क्रोम से कोई और चेतावनी नहीं।
  • फायरबग आपको जेएसओएन डेटा स्वरूपित दिखाते हुए प्रतिक्रिया में एक टैब जोड़ देगा। यदि एमआईएमई प्रकार अलग है, तो यह सिर्फ 'प्रतिक्रिया सामग्री' के रूप में दिखाई देगा।

JSON:

URL में पारित क्वेरी पैरामीटर के अनुसार प्रतिक्रिया गतिशील रूप से जेनरेट की गई डेटा है।

उदाहरण:

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

सामग्री-प्रकार: application/json

JSON-पी:

पैडिंग के साथ JSON। प्रतिक्रिया जेएसओएन डेटा है, इसके चारों ओर एक फंक्शन कॉल लपेटा गया है।

उदाहरण:

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

सामग्री-प्रकार: application/javascript


पोस्टिंग करते समय सामग्री-प्रकार शीर्षलेख ' एप्लिकेशन / जेसन ' पर सेट होना चाहिए। अनुरोध के लिए सर्वर सुनना " स्वीकार करें = एप्लिकेशन / जेसन " शामिल होना चाहिए। स्प्रिंग एमवीसी में आप इसे इस तरह से कर सकते हैं:

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

प्रतिक्रिया में हेडर जोड़ें:

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

आईएएनए ने जेएसओएन के लिए आधिकारिक एमआईएमई प्रकार application/json रूप में पंजीकृत किया है।

जब text/json क्यों नहीं पूछा जाता है, तो क्रॉकफोर्ड ने कहा है कि JSON वास्तव में जावास्क्रिप्ट नहीं है और न ही पाठ और आईएएनए text/* से application/* को संभालने की अधिक संभावना है।

और अधिक संसाधनों:


सामग्री प्रकार application/json लिए सबकुछ काम नहीं करता है।

यदि आप फ़ाइल अपलोड करने के लिए Ext JS फॉर्म सबमिट कर रहे हैं, तो ध्यान रखें कि <iframe> लिए दस्तावेज़ बनाने के लिए सर्वर द्वारा सर्वर प्रतिक्रिया को पार्स किया गया है।

यदि सर्वर रिटर्न ऑब्जेक्ट भेजने के लिए JSON का उपयोग कर रहा है, तो दस्तावेज़ बॉडी में अपरिवर्तित टेक्स्ट डालने के लिए ब्राउज़र को बताने के लिए Content-Type शीर्षलेख को text/html सेट किया जाना चाहिए।

एक्सटी जेएस 3.4.0 एपीआई दस्तावेज देखें


यदि आप क्लाइंट-साइड वातावरण में हैं, तो क्रॉस-ब्राउज़र समर्थन के बारे में जांच करना एक अच्छी तरह से समर्थित वेब एप्लिकेशन के लिए अनिवार्य है।

सही HTTP सामग्री-प्रकार application/json , क्योंकि अन्य पहले से ही हाइलाइट किए गए हैं, लेकिन कुछ क्लाइंट इसे बहुत अच्छी तरह से संभाल नहीं पाते हैं, यही कारण है कि jQuery डिफ़ॉल्ट text/html सिफारिश करता है।


PHP डेवलपर्स इसका उपयोग करते हैं:

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

    // Do something here...
?>

यदि आप एक वास्तविक इंटरफ़ेस के खिलाफ बहुत से JSON भेज / प्रतिक्रियाओं का परीक्षण कर रहे हैं, तो आप क्रोम के लिए Postman प्लग-इन देखना चाहते हैं (जो आपको वेब सेवा परीक्षणों को मैन्युअल रूप से परिभाषित करने की अनुमति देता है) और इसके नोड.जेएस-आधारित Newman कमांड -लाइन साथी (जो आपको पोस्टमैन परीक्षणों के "संग्रह" के खिलाफ परीक्षण स्वचालित करने की अनुमति देता है।) दोनों स्वतंत्र और खुले!





json content-type