2012-06-16 12 views
25

Pasamos una hora entera tratando de resolver qué en la tierra esto (CoffeeScript)¿Cuál es el punto de jQuery ajax acepta attrib? ¿Realmente hace algo?

$.ajax 
    accepts: "application/json; charset=utf-8" 

hicieron absolutamente nada para cambiar la acepta cabecera, mientras que este

$.ajax 
    dataType: "json" 

establece correctamente la acepta cabecera de application/json; charset=utf-8

Totalmente confundido, ¿me estoy perdiendo algo o el accept attrib es una broma de April Fool durante todo el año?

Respuesta

24

Como siempre el documentation es su amigo:

acepta

defecto: depende de DataType

El tipo de contenido enviado en la cabecera petición que le dice al servidor qué tipo de respuesta será aceptar a cambio. Si la configuración de aceptación necesita modificación, se recomienda hacerlo una vez en el método $ .ajaxSetup().

tipoDatos

defecto: suposición inteligente (XML, JSON, script o HTML)

El tipo de datos que usted está esperando respuestas del servidor. Si no se especifica ninguno , jQuery intentará inferirlo basándose en el tipo MIME de la respuesta (un tipo XML MIME arrojará XML, en 1.4 JSON arrojará un objeto JavaScript, en 1.4 script ejecutará el script, y cualquier otra cosa será devuelta como una cadena). Los tipos disponibles (y el resultado pasado como primer argumento para su devolución de llamada de éxito) son:

"xml": Devuelve un documento XML que puede ser procesada a través de jQuery.

"html": Devuelve HTML como texto sin formato; las etiquetas de script incluidas se evalúan cuando se insertan en el DOM.

"secuencia de comandos": Evalúa la respuesta como JavaScript y la devuelve como texto sin formato. Inhabilita el almacenamiento en caché al agregar un parámetro de cadena de consulta, _=[TIMESTAMP], a la URL a menos que la opción de caché esté establecida en verdadero. Nota: Esto convertirá las POST en GET para solicitudes de dominio remoto .

"json": Evalúa la respuesta como JSON y devuelve un objeto JavaScript. En jQuery 1.4, los datos JSON se analizan en de una manera estricta; cualquier JSON malformado es rechazado y se produce un error de análisis de . (Consulte json.org para obtener más información sobre el formato JSON adecuado).)

"jsonp": Se carga en un bloque JSON con JSONP. Agrega un extra ?callback=? al final de su URL para especificar la devolución de llamada. Deshabilita el almacenamiento en caché de al agregar un parámetro de cadena de consulta,
_=[TIMESTAMP], al URL a menos que la opción de caché esté establecida en verdadero.

"texto": texto sin formato cadena. valores múltiples separados por espacios: a partir de jQuery 1.5, jQuery puede convertir un tipo de datos de lo que recibió en el encabezado Content-Type a lo que necesita. Por ejemplo, si desea que una respuesta de texto sea tratada como XML, use "texto xml" para el tipo de datos. También puede realizar una solicitud JSONP , recibirla como texto e interpretarla jQuery como XML: "jsonp text xml". Del mismo modo, una cadena de taquigrafía como "jsonp xml" primero intentará convertir de jsonp a xml y, a falta de , convertir de jsonp a texto y luego de texto a xml.

Volviendo a su problema. No estoy familiarizado con coffeescript pero al contrario de dataType que es una cadena, el parámetro accepts es un mapa y se debe utilizar la siguiente manera:

$.ajax({ 
    url: ... 
    dataType: 'json', 
    accepts: { 
     xml: 'text/xml', 
     text: 'text/plain' 
    } 
}); 
+12

+1, se acuerda RE: documentación; sin embargo, no es totalmente intuitivo proporcionar un atributo con el nombre del encabezado que está tratando de cambiar, que de hecho es un ciudadano de segunda clase en relación con el controlador real del bus, dataType. Confundir que configurar tanto dataType como accept parece dar como resultado un encabezado de respuesta predeterminado. De todos modos, me alegro de haber encontrado que el tipo de datos solo hace el trabajo ... – virtualeyes

+18

Debo estar de acuerdo con los virtualeyes, nombre bastante poco intuitivo. Y esta documentación es como un amigo que es difícil de entender rápidamente:) ... Además, el enlace de declaración de tipo 'Mapa' apunta a http://api.jquery.com/Types/#Map, que parece describir una información parámetro. No hay un código de ejemplo. Y el "Predeterminado: depende de DataType" es una subestimación, ¿no es así? Siempre _ depende de 'dataType', que da el orden de los tipos, ¿verdad? ... idealmente, la documentación debería ser más como un extraño que uno comprende de inmediato. Lo cual es, por supuesto, difícil de lograr, lo sé. –

+0

Si no se especifican 'dataType' ni' accept', ¿qué encabezado de HTTP Accepts se envía? ¿Ninguna? –