Пользовательский заголовок jQuery AJAX
Я пытаюсь выполнить запрос к API iContact, который потребовал от меня использовать настраиваемый заголовок для аутентификации (http://developer.icontact.com/documentation/authenticate-requests). Это мой код:
$.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);}
});
По какой-то причине запрос не проходит. Однако, когда я выполняю тот же запрос вручную (используя консоль Chrome REST), он работает нормально. Если я вывожу пользовательские заголовки (API- *), запрос проходит, но, конечно, аутентификация завершается с ошибкой, и я возвращаю регулярную HTML-страницу.
Я перешел на Firefox и проверил заголовки запроса/ответа:
Запрос:
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
Ответ:
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
Любые идеи, что здесь происходит не так?
Спасибо!
Ответы
Ответ 1
Крючок beforeSend доступен только для $.ajaxSetup()
, поэтому, если вы хотите добавить его только в $.ajax()
, вы можете просто пойти с свойством headers
.
Если вы хотите добавить собственный заголовок (или набор заголовков) к отдельному запросу, просто добавьте свойство заголовков:
// Request with custom header
$.ajax({
url: 'foo/bar',
headers: { 'x-my-custom-header': 'some value' }
});
Если вы хотите добавить заголовок по умолчанию (или набор заголовков) к каждому запросу, используйте $.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' } });
Если вы хотите добавить заголовок (или набор заголовков) к каждому запросу, используйте beforeSend
hook с $.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' } });
Изменить (подробнее):. Одна вещь, о которой нужно знать, это то, что при ajaxSetup
вы можете определить только один набор заголовков по умолчанию, и вы можете определить только один beforeSend
. Если вы вызовете ajaxSetup
несколько раз, будет отправлен только последний набор заголовков, и будет выполнен только последний обратный вызов до отправки.
Источник: fooobar.com/questions/8835/...
Ответ 2
Странно, что вы получаете 302 (перенаправленный) в ответе. Пробовали ли вы ошибку регистрации с помощью функции Ajax, чтобы устранить проблему? Вот пример того, что я использовал.
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);
}
});
Ответ 3
попробуйте это, конечно, вы можете решить проблему.
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;
});
}