2015-10-11 2 views
7

Sto cercando di capire la differenza tra accetta e dataType in una richiesta Ajax. stati di documentazione:dataType vs accept - Ajax Request

Documentation

accetta (impostazione predefinita: dipende DataType) Tipo: PlainObject Il tipo di contenuto inviato nell'intestazione della richiesta che indica al server che tipo di risposta che accetterà in cambio.

dataType (default: Indovina intelligente (XML, JSON, uno script o HTML)) Tipo: String Il tipo di dati che vi aspettate dal server.

Fondamentalmente, è lo stesso ?, ha lo stesso scopo.

+2

"Si invia" vs "Si aspetta" – SerCrAsH

+0

Per inviare è contentType, la mia domanda riguarda dataType e accetta che entrambi siano apparentemente per ciò che mi aspetto dal server. –

+0

Sembra che 'accept' è il modo in cui devi dire al server che tipo di risposta vuoi, nel caso abbia molte opzioni da offrire, mentre' dataType' è ciò che ti aspetti come risposta in modo che la risposta sia corettamente analizzato. –

risposta

8

Ecco una, si spera, risposta precisa:

L'opzione accepts permettono di modificare l'intestazione Accept nella richiesta

Quando si modifica questa opzione, verrà impostata la Accept intestazione nella richiesta a uno (i) specificato. Prendi nota che non si tratta di una stringa, ma di un oggetto che mappa il tipo MIME delle risposte accettate. Come { text: "text/plain", html: "text/html" }. L'intestazione può essere utilizzata dal server per fornire la risposta nel formato previsto dalla richiesta, oppure fallire nel caso in cui non possa fornire la risposta in uno dei formati previsti dalla richiesta.

Una cosa veramente importante è che, almeno in jQuery 1.11.3 (dove ho provato), questa opzione sembra non funzionare, invece sono riuscito a cambiare l'intestazione usando l'opzione headers: headers: {Accept : "text/json"}.

L'opzione dataType si lascia pre-processo della risposta

Se si definisce un dataType, la risposta della richiesta verrà pre-trattati da jQuery prima di essere a disposizione del gestore successo. Ad esempio:

Se si specifica json, la risposta viene analizzato utilizzando jQuery.parseJSON prima di essere passato, come un oggetto, al gestore successo.

Se è specificato script, $.ajax() eseguirà il codice JavaScript ricevuto dal server prima di trasmetterlo al gestore di successo come stringa.

Altri esempi here, nella sezione "Tipi di dati".

Nel caso che dataType non sia impostato, lo Content-Type della risposta determinerà quale pretrattamento deve essere eseguito per la risposta. Si tenga presente che la modifica di cambierà anche l'intestazione . Di solito non è necessario modificare da soli l'intestazione .

Esempio

richiesta.php

<?php 
if(strpos($_SERVER["HTTP_ACCEPT"],"text/javascript") === false) 
    exit("I only provide text/javascript responses"); 

echo "alert('This is my response!')"; 

index.html

<button id="send">Send</button> 
<div id="response"></div> 

<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script> 
<script> 
$(function(){ 

    $("#send").click(function(){ 
     $.ajax({ 
      method: "GET", 
      url: "request.php", 
      dataType: "script" // Change this to "text" and you will see the difference 
     }).done(function(data) { 
      $("#response").text(data); 
     }); 
    }); 


}); 
</script> 

Quando il dataType è impostato "script" l'intestazione Accept comprenderà "text/javascript" quindi il test su request.php passerà. Restituirà "alert('This is my response!')" e poiché dataType è impostato su "script" jQuery tenterà di eseguirlo come javascript e quindi lo passerà come testo normale al gestore di successo.

Se si cambia il dataType-"text" l'intestazione Accept non includerà "text/javascript" quindi il test sul request.php falliranno. Restituirà "I only provide text/javascript responses" e poiché dataType è impostato su "text" jQuery lo passerà come testo normale al gestore di successo.

+0

Grazie Alvaro, è stata una buona spiegazione. –

+2

Stavo riscontrando problemi con l'accettazione di intestazioni anche in 1.11.2, usando le intestazioni ': {Accept:" application/json "}' ha funzionato. Per qualche ragione inviava 'Accept: */*' anche se contentType e dateType ecc erano tutti impostati per json. –