2010-07-12 12 views
57

Necesito hacer una solicitud getJSON(), pero ¿cómo paso la autorización y los encabezados personalizados?¿Cómo puedo pasar los encabezados de solicitud con el método getJSON() de jQuery?

Estoy recibiendo problemas de que el encabezado de la solicitud toma el nombre, pero NO los valores. La URL se muestra a través de una solicitud manual en fiddler para que se inserte como opciones en lugar de GET/Url.

Aquí hay un ejemplo de lo que estamos tratando de hacer que funciona bien en el violín; ¿Cómo puedo replicar esto con la función AJAX? código

GET /Service.svc/logins/gdd53535342/houses/vxcbdfsdg/people/dsgsdggd?format=json HTTP/1.1 
User-Agent: Fiddler 
Authorization: Basic rgbg423535fa23y4436 
X-PartnerKey: df3fgeg-g5g6-b55b-f3d2-dsgg353523 
Host: 154.34.53.54:2757 

JavaScript:

xhr = new XMLHttpRequest(); 

$(document).ready(function() { 
    $.ajax({ 
    url: 'http://localhost:437/service.svc/logins/jeffrey/house/fas6347/devices?format=json', 
    type: 'GET', 
    datatype: 'json', 
    success: function() { alert("Success"); }, 
    error: function() { alert('Failed!'); }, 
    beforeSend: setHeader  
    }); 
}); 

function setHeader(xhr) { 
    xhr.setRequestHeader('Authorization', 'Basic faskd52352rwfsdfs'); 
    xhr.setRequestHeader('X-PartnerKey', '3252352-sdgds-sdgd-dsgs-sgs332fs3f'); 
} 

violinista normales Solicitar encabezados:

GET /service.svc/logins/jeffrey/house/fas6347/devices?format=json HTTP/1.1 
User-Agent: Fiddler 
Authorization: Basic faskd52352rwfsdfs 
X-PartnerKey: 3252352-sdgds-sdgd-dsgs-sgs332fs3f 
Host: localhost:437 

violinista través Ajax() Solicitar encabezados:

OPTIONS service.svc/logins/jeffrey/house/fas6347/devices?format=json HTTP/1.1 
Host: localhost:437 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Proxy-Connection: keep-alive 
Origin: http://ipv4.fiddler:61975 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: authorization,x-partnerkey 
+1

Si usted está haciendo esto para un servicio JSONP, no se puede establecer cabeceras extra. – Pointy

+0

no solo una json normal. – Berty

Respuesta

69

Estoy de acuerdo con sunetos de que tendrá que usar la función $ .ajax para pasar los encabezados de solicitud. Para hacerlo, deberá escribir una función para el controlador de eventos beforeSend, que es una de las opciones de $ .ajax(). He aquí una muestra rápida sobre cómo hacer eso:

<html> 
    <head> 
    <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
     $.ajax({ 
      url: 'service.svc/Request', 
      type: 'GET', 
      dataType: 'json', 
      success: function() { alert('hello!'); }, 
      error: function() { alert('boo!'); }, 
      beforeSend: setHeader 
     }); 
     }); 

     function setHeader(xhr) { 
     xhr.setRequestHeader('securityCode', 'Foo'); 
     xhr.setRequestHeader('passkey', 'Bar'); 
     } 
    </script> 
    </head> 
    <body> 
    <h1>Some Text</h1> 
    </body> 
</html> 

Si ejecuta el código anterior y ver el tráfico en una herramienta como Fiddler, verá dos cabeceras de las solicitudes aprobadas en:

  • SecurityCode con un valor de Foo
  • clave de acceso con un valor de Bar

La función setHeader también podría ser en línea en los $ .ajax opciones, pero quería llamar a cabo.

Espero que esto ayude!

+0

Compruebe los cambios realizados en la publicación original (Nueva pregunta) – Berty

+2

No estoy seguro de entender el problema. La clave/valores del encabezado deben pasarse al servicio no como parte de la URL, sino como opciones (como usted dijo). Debería configurar X-PartnerKey y Authorization de la forma en que el ejemplo establece 'securityCode' y 'passkey' (que eran solo encabezados que inventé). El Host y el User-Agent deben configurarse cuando realiza la llamada $ .ajax. Lo siento si no estoy entendiendo el problema correctamente.Si tiene un código fuente, publíquelo y quizás eso ayude. Gracias! –

+1

He configurado los encabezados de solicitud de la misma forma que lo hizo para los ejemplos, pero después de ejecutar esto y verlo a través de violín aparecen los nombres de los encabezados, pero no los valores. También en el violín estoy tratando de hacer un GET que se mostraría como GET/URL pero si configuro el tipo para GET aparece como OPTIONS/URL. Espero que eso tenga más sentido. Publicaré el código fuente pero es prácticamente el mismo que el tuyo. Gracias otra vez – Berty

12

El método .getJSON $() es sho mano que no le permite especificar opciones avanzadas como esa. Para hacer eso, necesitas usar el método completo $ .ajax(). Aviso en la documentación en http://api.jquery.com/jQuery.getJSON/, "Esta es una función Ajax taquigrafía, lo que equivale a:"

$.ajax({ 
    url: url, 
    dataType: 'json', 
    data: data, 
    success: callback 
}); 

Entonces sólo tiene que utilizar $ .ajax() y proporcionar todos los parámetros adicionales que necesita.

24

Creo que se podría establecer los encabezados y seguir utilizando getJSON() así:

$.ajaxSetup({ 
    headers : { 
    'Authorization' : 'Basic faskd52352rwfsdfs', 
    'X-PartnerKey' : '3252352-sdgds-sdgd-dsgs-sgs332fs3f' 
    } 
}); 
$.getJSON('http://localhost:437/service.svc/logins/jeffrey/house/fas6347/devices?format=json', function(json) { alert("Success"); }); 
+2

De los documentos (http://api.jquery.com/jquery.ajaxsetup/): "No se recomienda su uso". –

+3

@ matt-burns, cierto. Mi solución haría que cada solicitud de jquery ajax tuviera esos dos valores en los encabezados. Creo que en este caso es inofensivo. Podría encontrarse con problemas potencialmente si estuviera usando ajaxSetup() para configurar la url o el tipo de solicitud. Eso me desanimaría. Algo a tener en cuenta. –

+1

En mi caso, tengo que usar el mismo encabezado para todas las llamadas a getJSON, así que esta es una buena solución para mí :) – marlar

Cuestiones relacionadas