Wat is het juiste JSON-inhoudstype?

Ik ben al een tijdje aan het rommelen met JSON, en duw het er gewoon uit als tekst en het heeft niemand pijn gedaan (voor zover ik weet), maar ik zou de dingen graag goed willen doen.

Ik heb zoveel vermeende “standaarden” gezien voor het JSON-inhoudstype:

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

Maar welke is juist of het beste? Ik begrijp dat er problemen zijn met beveiliging en browserondersteuning.

Ik weet dat er een vergelijkbare vraag is, Welk MIME-type als JSON wordt geretourneerd door een REST API?, maar ik zou graag een iets gerichter antwoord willen.


Antwoord 1, autoriteit 100%

Voor JSON-tekst:

application/json

Het MIME-mediatype voor JSON-tekst is application/json. De standaardcodering is UTF-8. (Bron: RFC 4627)

Voor JSONP(uitvoerbaar JavaScript) met callback:

application/javascript

Hier zijn enkele blogberichten die werden genoemd in de relevante opmerkingen:


Antwoord 2, autoriteit 16%

IANAheeft het officiële MIME-type voor JSON geregistreerd als application/json.

Op de vraag waarom niet text/json, lijkt Crockford te hebben gezegd dat JSON niet echt JavaScript of tekst is en dat IANA eerder application/*uitdeelde dan text/*.

Meer bronnen:


Antwoord 3, autoriteit 9%

Voor JSON:

Content-Type: application/json

Voor JSON-P:

Content-Type: application/javascript

Antwoord 4, autoriteit 6%

Natuurlijk is het juiste MIME-mediatype voor JSON application/json, maar het is noodzakelijk om te beseffen welk type gegevens in uw toepassing wordt verwacht.

Ik gebruik bijvoorbeeld Ext GWTen de serverreactie moet gaan als text/htmlmaar bevat JSON-gegevens.

Klantzijde, Ext GWT vorm luisteraar

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

In het geval van het gebruik van het antwoordtype application/json, stelt de browser me voor om het bestand op te slaan.

Snippet van de broncode aan de serverzijde met behulp van 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);
    }
};

Antwoord 5, autoriteit 4%

JSON:

Reactie is dynamisch gegenereerde gegevens, volgens de queryparameters die in de URL zijn doorgegeven.

Voorbeeld:

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

Inhoudstype:application/json


JSON-P:

JSON met opvulling.
Reactie is JSON-gegevens, met een functieaanroep eromheen.

Voorbeeld:

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

Inhoudstype:application/javascript,


Antwoord 6, autoriteit 4%

Als u Ubuntu of Debian gebruikt en u .json-bestanden aanbiedt via Apache, wilt u wellicht de bestanden met het juiste inhoudstype aanbieden. Ik doe dit voornamelijk omdat ik de Firefox-extensie JSONView

wil gebruiken

De Apache-module mod_mimehelpt om dit gemakkelijk te doen. Met Ubuntu moet u echter het bestand /etc/mime.typesbewerken en de regel toevoegen

application/json json

Herstart Apache vervolgens:

sudo service apache2 restart

Antwoord 7, autoriteit 4%

Als je ASP.NET Web Services vanaf de client-kant belt, moet je application/jsongebruiken om het te laten werken. Ik geloof dat dit hetzelfde is voor de jQueryen Ext-frameworks.


Antwoord 8, autoriteit 3%

Het juiste inhoudstype voor JSON is application/jsonTENZIJ u JSONPgebruikt , ook bekend als JSON met Padding, wat eigenlijk JavaScript is en daarom zou het juiste inhoudstype application/javascript,zijn.


Antwoord 9, autoriteit 3%

Het lijdt geen twijfel dat application/jsonde beste MIMEtyp voor een JSON-antwoord.

Maar ik had enige ervaring waarbij ik application/x-javascriptmoest gebruiken vanwege compressieproblemen. Mijn hostingomgeving is shared hosting met GoDaddy. Ze staan ​​me niet toe om serverconfiguraties te veranderen. Ik had de volgende code toegevoegd aan mijn web.config-bestand om reacties te comprimeren.

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

Hierdoor werden de .aspx-pagina’s gecomprimeerd met g-zip, maar JSON-reacties niet. Ik heb toegevoegd

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

in de secties statische en dynamische typen. Maar dit comprimeert helemaal geen JSON-reacties.

Daarna heb ik dit nieuw toegevoegde type verwijderd en toegevoegd

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

in zowel de secties voor statische als dynamische typen, en veranderde het antwoordtype in

.ashx (asynchrone handler) naar

application/x-javascript

En nu ontdekte ik dat mijn JSON-reacties waren gecomprimeerd met g-zip. Dus ik raad persoonlijk aan om

application/x-javascript

alleen als u uw JSON-reacties wilt comprimeren op een gedeelde hostingomgeving. Omdat ze u bij shared hosting niet toestaan ​​om IIS-configuraties te wijzigen.


Antwoord 10, autoriteit 3%

Alleen bij gebruik van application/jsonals MIMEtype I hebben het volgende (vanaf november 2011 met de meest recente versies van Chrome, Firefox met Firebug):

  • Geen waarschuwingen meer van Chrome wanneer de JSON van de server wordt geladen.
  • Firebug voegt een tabblad toe aan het antwoord met de JSON-gegevens
    geformatteerd. Als het MIME-type anders is, wordt het gewoon weergegeven als:
    ‘Reactieinhoud’.

Antwoord 11, autoriteit 2%

Niet alles werkt voor inhoudstype application/json.

Als je een Ext JSformulier gebruikt om het bestand te uploaden, houd er dan rekening mee dat de server reactie wordt door de browser geparseerd om het document voor de <iframe>te maken.

Als de server JSON gebruikt om het retourobject te verzenden, moet de Content-Type-header worden ingesteld op text/HTMLom de browser te laten weten dat deze moet invoegen de tekst ongewijzigd in de hoofdtekst van het document.

Zie de Ext JS 3.4.0 API-documentatie.


Antwoord 12, autoriteit 2%

JSON is een domeinspecifieke taal(DSL) en een gegevensformaat dat onafhankelijk is van JavaScript, en als zodanig heeft zijn eigen MIME-type, application/json. Respect voor MIME-typen is natuurlijk client-gedreven, dus text/plainkan voldoende zijn voor de overdracht van bytes, maar dan zou je de interpretatie onnodig naar het applicatiedomein van de leverancier pushen – application/json. Zou je XML overdragen via text/plain?

Maar eerlijk gezegd, uw keuze voor het MIME-type is advies aan de klant over hoe de gegevens te interpreteren – text/plainof text/HTML(als het geen HTML is) ) lijkt op het wissen van typen – het is net zo weinig informatief als het maken van al uw objecten van het type Object in een getypte taal.

Geen enkele browserruntime die ik ken, zal een JSON-document gebruiken en het automatisch beschikbaar stellen aan de runtime als een JavaScript-toegankelijk object zonder tussenkomst, maar als je met een kreupele client werkt, is dat een heel andere zaak. Maar dat is niet het hele verhaal- RESTfulJSON-services hebben vaak geen JavaScript-runtimes, maar het stopt niet ze gebruiken JSON als een levensvatbaar formaat voor gegevensuitwisseling. Als klanten zo kreupel zijn… dan zou ik in plaats daarvan misschien HTML-injectie overwegen via een Ajax-sjabloonservice.

Applicatie/JSON!


Antwoord 13, autoriteit 2%

Als u zich in een clientomgeving bevindt, is onderzoek naar de ondersteuning voor meerdere browsers verplicht voor een goed ondersteunde webtoepassing.

Het juiste HTTP-inhoudstype zou application/jsonzijn, zoals anderen ook al hebben benadrukt, maar sommige clients gaan er niet goed mee om, daarom beveelt jQuery de standaard text/html.


Antwoord 14, autoriteit 2%

Het juiste antwoord is:

Content-Type: application/json

Antwoord 15, autoriteit 2%

Zoals vele anderen al hebben gezegd, is application/jsonhet juiste antwoord.

Maar wat nog niet is uitgelegd, is wat de andere opties die je hebt voorgesteld betekenen.

  • application/x-javascript: experimenteel MIME-type voor JavaScript voordat application/javascript,standaard werd gemaakt.

  • text/javascript: nu verouderd. U moet application/javascript,gebruiken wanneer u javascript gebruikt.

  • text/x-javascript: Experimenteel MIME-type voor de bovenstaande situatie.

  • text/x-json: Experimenteel MIME-type voor JSON voordat application/jsonofficieel werd geregistreerd.

Al met al, als je twijfels hebt over inhoudstypes, moet je deze link


Antwoord 16

In JSPkunt u dit gebruiken in pagina-richtlijn:

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

Het juiste MIME-mediatype voor JSON is application/json. JSP zal het gebruiken om een ​​reactie naar de klant te sturen.


Antwoord 17

application/jsonis het juiste JSON-inhoudstype.

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

Antwoord 18

De IANA-registratie voor application/jsonzegt

Toepassingen die dit mediatype gebruiken: JSON is gebruikt om
gegevens uitwisselen tussen applicaties die in al deze zijn geschreven
programmeertalen: ActionScript, C, C#, Clojure, ColdFusion,
Gemeenschappelijke Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML,
Perl, PHP, Python, Rebol, Ruby, Scala en Schema.

Je zult merken dat IANA.org geen van de deze andere mediatypen, in feite is zelfs application/javascript,nu achterhaald. Dus application/jsonis eigenlijk het enige mogelijke juisteantwoord.

Browserondersteuning is iets anders.

De meest ondersteunde niet-standaard mediatypen zijn text/jsonof text/javascript. Maar sommige grote namen gebruiken zelfs text/plain.

Nog vreemder is de Content-Type header die wordt verzonden door Flickr, die JSON retourneert als text/xml. Google gebruikt text/javascriptvoor sommige van zijn ajax api’s.

Voorbeelden:

curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"

Uitvoer: Content-Type: text/javascript

curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"

Uitvoer: Content-Type: text/xml


Antwoord 19

Het juiste MIME-type is application/json

MAAR

Ik heb veel situaties meegemaakt waarin het browsertype of de frameworkgebruiker het volgende nodig had:

text/html
application/javascript

Antwoord 20

Ik gebruik de onderstaande

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

Antwoord 21

De kop Content-Typemoet worden ingesteld op ‘application/json‘ bij het posten. De server die naar het verzoek luistert, moet “Accept=application/json” bevatten.
In Spring MVC kun je het als volgt doen:

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

Voeg kopteksten toe aan het antwoord:

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

Antwoord 22

De application/jsonwerkt prima in PHP om een ​​array of object op te slaan
gegevens.

Ik gebruik deze code om gegevens in JSON op te slaan op Google Cloud Storage (GCS)die is ingesteld publiekelijk zichtbaar:

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

Om de gegevens terug te krijgen is eenvoudig:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));

Antwoord 23

In Springheb je een gedefinieerd type: MediaType.APPLICATION_JSON_VALUEwat gelijk is aan application/json.


Antwoord 24

Voor JSON gebruik ik:

Content-Type: application/json

Dit wordt beschreven in het JSON Data Interchange Format 7158-voorstel van de IETF, Sectie 1.2: Specificaties van JSON.


Antwoord 25

Als de JSON met padding is, is dit application/jsonp. Als de JSON geen opvulling heeft, is het application/json.

Om met beide om te gaan, is het een goede gewoonte om ‘application/javascript’ te gebruiken zonder dat u zich zorgen hoeft te maken of het met opvulling of zonder opvulling is.


Antwoord 26

PHP-ontwikkelaars gebruiken dit:

<?php
    header("Content-type: application/json");
    // Do something here...
?>

Antwoord 27

Uitbreiding van de geaccepteerde antwoorden, wanneer u JSON gebruikt in een REST-context…

Er is een sterk argumentover het gebruik van de application/x-resource+jsonen application/x-collection+jsonwanneer u REST-bronnen en -verzamelingen vertegenwoordigt.

En als u besluit de jsonapi-specificatie te volgen, moet ugebruik maken van application/vnd.api+json, zoals gedocumenteerd.

Hoewel er geen universele standaard is, is het duidelijk dat de toegevoegde semantiek aan de bronnen die worden overgedragen een explicieter Content-Typerechtvaardigt dan alleen application/json.

Volgens deze redenering zouden andere contexten een specifieker Content-Typekunnen rechtvaardigen.


Antwoord 28

Als u gegevens van REST API in JSON krijgt, moet u content-type gebruiken

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

Antwoord 29

JSON(JavaScript Object Notation) en JSONP(“JSON met opvulling”)-indelingen lijken erg op elkaar en daarom kan het erg verwarrend zijn welk MIME-type ze moeten gebruiken. Hoewel de formaten vergelijkbaar zijn, zijn er enkele subtiele verschillen tussen hen.

Dus als ik twijfels heb, heb ik een heel eenvoudige aanpak (die in de meeste gevallen prima werkt), namelijk, ga en controleer het bijbehorende RFC-document.

JSON
RFC 4627(De applicatie/json Media Type voor JavaScript Object Notation (JSON)) is een specificaties van JSON-formaat. In sectie 6 staat dat het MIME-mediatype voor JSON-tekst

. is

application/json.

JSONP
JSONP (“JSON met opvulling”) wordt in een browser op een andere manier afgehandeld dan JSON. JSONP wordt behandeld als een gewoon JavaScript-script en daarom moet het application/javascript,gebruiken, het huidige officiële MIME-type voor JavaScript. In veel gevallen zal het MIME-type text/javascriptechter ook goed werken.

Merk op dat text/javascriptis gemarkeerd als verouderd door RFC 4329(Scripting Media Types) document en het wordt aanbevolen om in plaats daarvan het type application/javascript,te gebruiken. Vanwege verouderde redenen wordt text/javascriptechter nog steeds veel gebruikt en biedt het ondersteuning voor meerdere browsers (wat niet altijd het geval is met het MIME-type application/javascript,, vooral met oudere browsers).


Antwoord 30

Content-Type: application/json– json

Content-Type: application/javascript– json-P

Content-Type: application/x-javascript– javascript

Content-Type: text/javascript– javascript MAAR verouderde, oudere IE-versies die gebruikt werden als html-attribuut.

Content-Type: text/x-javascript– JavaScript-mediatypen MAAR verouderd

Content-Type: text/x-json– json voordat applicatie/json officieel werd geregistreerd.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes