2011-06-15 32 views
10

Estoy tratando de realizar una solicitud a la API de iContact que me requirió usar un encabezado personalizado para la autenticación (http://developer.icontact.com/documentation/authenticate-requests). Este es mi código:jQuery AJAX Encabezado personalizado

$.ajax({ 
     type: "GET", 
     url: "https://app.icontact.com/icp/a/", 
     contentType: "application/json", 
     beforeSend: function(jqXHR, settings){ 
       jqXHR.setRequestHeader("Accept", "application/json"); 
       jqXHR.setRequestHeader("Api-Version", iContact_API_version); 
       jqXHR.setRequestHeader("Api-AppId", iContact_appID); 
       jqXHR.setRequestHeader("Api-Username", iContact_username); 
       jqXHR.setRequestHeader("API-Password", iContact_appPassword);} 
}); 

Por alguna razón, la solicitud no se procesa. Sin embargo, cuando realizo la misma solicitud manualmente (usando la consola REST de Chrome) funciona bien. Si elimino los encabezados personalizados (API- *), la solicitud se procesa pero, por supuesto, la autenticación falla y recupero una página HTML normal.

me cambiaron a Firefox y comprueba Solicitud/encabezados de respuesta:

Solicitud:

Host app.icontact.com 
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 
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 
Connection keep-alive 
Origin http://184.72.61.244 
Access-Control-Request-Me... GET 
Access-Control-Request-He... api-appid,api-password,api-username,api-version 

Respuesta:

HTTP/1.1 302 Found 
Date: Tue, 14 Jun 2011 23:43:56 GMT 
Server: Apache/2.2.9 (Debian) 
Set-Cookie: intellicontact_phpsess=1c7ca333017b47f46edd893dae584781; path=/; domain=.icontact.com; secure; HttpOnly 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Location: https://app.icontact.com/icp/login/sentry.php?relurl=https%3A%2F%2Fapp.icontact.com%2Ficp%2Fa%2F&sess= 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Length: 20 
Connection: close 
Content-Type: text/html; charset=utf-8 

Alguna idea de lo que va mal aquí?

Gracias!

+0

Probablemente se esté mirando una solicitud de OPCIONES, que está buscando si el host de destino permite que las solicitudes de varios dominios, [más info] (http://stackoverflow.com/questions/1256593/ jquery-por-qué-estoy-obteniendo-una-opción-solicitud-insted-de-obtener-solicitud).Una solución alternativa es usar JSONP, pero esto no admite encabezados personalizados, [aquí está el por qué] (http://stackoverflow.com/questions/3350778/modify-http-headers-for-a-jsonp-request). Puede terminar usando [cURL] (http://en.wikipedia.org/wiki/CURL) o los "me gusta" si iContact no es compatible con solicitudes ajax de dominio cruzado o JSONP. –

+0

posible duplicado de [Publicación de JSON con campo HTTPHeader personalizado] (http://stackoverflow.com/questions/7100294/json-post-with-customized-httpheader-field) – JAAulde

+0

http://stackoverflow.com/a/14655768/ 1581725 –

Respuesta

0

Es extraño que obtenga un 302 (Redireccional) en la respuesta. ¿Has probado el error de registro con la función Ajax para solucionar el problema? Aquí hay un ejemplo de algo que utilicé.

console.log(" call back url :"+ callBackURL); 
       $.ajax({ 
        url: callBackURL, 
        type: 'post', //'GET' in your case  
        contentType: 'application/json; charset=utf-8', 
        dataType: 'json' , // explicitly mentioning datatype 
        success: function(json) { 
         console.log(" reponse :"+ json); 

        }, 
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
          console.log("error :"+XMLHttpRequest.responseText); 
        } 


       }); 
-1

por favor intente esto seguramente puede resolver el problema.

function FormSubmit() 
    { 
    $.ajax({  
    type: "POST", 
    url: 'index.php', 
    data: $("#form_main").serialize(), 
    async: false }).done(function(data) { 
    $("#Response").hide(); 
    if (isNaN(data)) { 

    dispmsg = "<div class='alert alert-danger' role='alert'>Oops..Something had gone wrong! Please try again!</div>"; 
    $("#assess_me_response").html(dispmsg); setTimeout('ResetForm();',3000); 
    } 
    else { 

    dispmsg = "<div class='alert alert-success' role='alert'>Thank you for sharing the details. Our Consultant will contact you shortly!</div>"; $("#assess_me_response").html(dispmsg); setTimeout('Redirect();',3000); 

    } 
     return true; 
     }); 
    } 
+2

En general, las respuestas son mucho más útiles si incluyen una explicación de lo que el código está destinado a hacer, y por qué eso resuelve el problema sin introducir otros. Agregar "probar esto" no cuenta. –

+0

¿Cómo está su código configurando encabezados personalizados, exactamente? – Drakes

1

El gancho beforeSend sólo está disponible para $.ajaxSetup() por lo que si desea agregar sólo a la $.ajax() sólo tiene que ir con la propiedad headers.


Si desea agregar un encabezado personalizado (o conjunto de cabeceras) a una solicitud individual a continuación, sólo añadir la propiedad encabezados:

// Request with custom header 
$.ajax({ 
    url: 'foo/bar', 
    headers: { 'x-my-custom-header': 'some value' } 
}); 

Si desea añadir un encabezado predeterminado (o conjunto de cabeceras) a cada solicitud a continuación, utilizar $.ajaxSetup():

$.ajaxSetup({ 
    headers: { 'x-my-custom-header': 'some value' } 
}); 

// Sends your custom header 
$.ajax({ url: 'foo/bar' }); 

// Overwrites the default header with a new header 
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } }); 

Si desea agregar un encabezado (o se t de cabeceras) a cada petición a continuación, utilizar el gancho beforeSend con $.ajaxSetup():

$.ajaxSetup({ 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader('x-my-custom-header', 'some value'); 
    } 
}); 

// Sends your custom header 
$.ajax({ url: 'foo/bar' }); 

// Sends both custom headers 
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } }); 

Editar (más información): Una cosa a tener en cuenta es que, con ajaxSetup sólo se puede definir un conjunto de encabezados predeterminados y solo puedes definir uno beforeSend. Si llama al ajaxSetup varias veces, solo se enviará el último conjunto de encabezados y solo se ejecutará la última devolución de llamada anterior al envío.

Fuente: https://stackoverflow.com/a/14655768/1581725

Cuestiones relacionadas