Я использую cloudant, CORS включен, все запросы работают, кроме _find
.
Мой запрос поиска очень хорошо работает с локальной CouchDB с этим кодом:
var urlPrefix = "http://localhost:5984/etablissements";
var query = {
"selector": {
"cp": 24000
}
};
$.ajax({
type: "POST",
url: urlPrefix + '/_find',
contentType: "application/json",
data:JSON.stringify(query),
success: function(data) {
console.log(data.docs);
// do whatever with data.docs there
}
});
Теперь я хочу сделать онлайн-вызов CORS jQuery AJAX и выполнить тот же запрос, что и мой первый запрос, к моей базе данных IBM Cloudant, но он не работает, хотя это тот же запрос и та же реплицированная база данных..
CORS включен в Cloudant.
urlPrefix = "https://USERNAME:PASSWORD@HOST.cloudant.com/etablissements";
var query = {
"selector": {
"cp": 24000
}
};
$.ajax({
type: "POST",
url: urlPrefix + '/_find',
contentType: "application/json",
data:JSON.stringify(query),
dataType: 'json',
crossDomain: true,
xhrFields: {
'withCredentials': true // tell the client to send the cookies if any for the requested domain
},
success: function(data) {
console.log(data.docs);
}
},
error:function(data){
console.log(data);
}
});
Я не получил ни одного сообщения об ошибке от Cloudant.Я просто получаю это сообщение об ошибке от jQuery:
{…}
abort: function abort()
always: function always()
catch: function catch()
done: function add()
fail: function add()
getAllResponseHeaders: function getAllResponseHeaders()
getResponseHeader: function getResponseHeader()
overrideMimeType: function overrideMimeType()
pipe: function pipe()
progress: function add()
promise: function promise()
readyState: 0
responseJSON: undefined
setRequestHeader: function setRequestHeader()
state: function state()
status: 0
statusCode: function statusCode()
statusText: "error"
then: function then()
__proto__: Object { … }
Другие запросы из этого документа (например, 'all') в настоящее время работают:
http://bradley -holt.com / 2011/07 / couchdb-jquery-plugin-reference /
РЕДАКТИРОВАТЬ: Glynn, все еще получаю ту же ошибку с самой последней версией Firefox и вашей копией вставленного кода, нетВызов ajax выполняется, вместо этого он проходит через процесс ошибки jquery:
РЕДАКТИРОВАТЬ 2: Я изменилнемного кода Глинна, и он работал в Chrome, но я должен был предоставить учетные данные во всплывающем окне из Chrome.Обратите внимание, что я удалил пароль для входа из переменной urlPrefix и что имя пользователя и пароль, предоставленные внутри jquery, не работают.Так что это еще не хорошее решение.Firefox все еще не работает с ошибкой, показанной выше:
<html>
<body>
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<script>
var urlPrefix = "https://1c54473b-be6e-42d6-b914-d0ecae937981-bluemix.cloudant.com/etablissements";
var query = {
"selector": {
"cp": 24000
}
};
$.ajax({
type: "POST",
url: urlPrefix + '/_find',
contentType: "application/json",
data:JSON.stringify(query),
dataType: 'json',
crossDomain: true,
username: "xxxxxxx-xxxxxxx-42d6-xxxxxx-xxxxxx-bluemix",
password:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
xhrFields: {
'withCredentials': true // tell the client to send the cookies if any for the requested domain
},
success: function(data) {
console.log(data);
},
error:function(data){
console.log(data);
}
});
</script>
</body>
</html>
РЕДАКТИРОВАТЬ 3: РЕШЕНО!
Мне удалось заставить его работать с помощью этой страницы: https://zinoui.com/blog/ajax-basic-authentication
Так что это мой последний код, протестированный в Firefox, Chrome и Opera, и наконец-то работающий!Так что теперь я могу выполнять _find запросы с включенным CORS на cloudant, и я ЛЮБЛЮ ЭТО!
Обратите внимание, что ключ к решению был jquery beforeSend () functio n, вынеобходимо предоставить учетные данные там:
<html><meta charset="utf-8" />
<head>
<title>JS Bin</title>
</head>
<body>
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous" charset="utf-8"></script>
<script>
var urlPrefix = "https://1c54473b-be6e-42d6-b914-d0ecae937981-bluemix.cloudant.com/etablissements";
var USERNAME = "xxxxxxxx-xxxxxxxx-42d6-b914-d0ecae937981-bluemix";
var PASSWORD = "xxxxxxxxxxxxxxxxxb9e74af7368b21a37b531aae819929d3405c7d22";
var query = {
"selector": {
"cp": 24000
}
};
$.ajax({
type: "POST",
contentType: "application/json",
data:JSON.stringify(query),
dataType: 'json',
crossDomain: true,
xhrFields: {
'withCredentials': true // tell the client to send the cookies if any for the requested domain
},
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Basic ' + btoa(USERNAME + ":" + PASSWORD));
},
url: urlPrefix + '/_find',
success: function(data) {
console.log(data);
},
error:function(data){
console.log(data);
}
});
</script>
</body>
</html>
Работа с приложениями CORS настолько полезна для создания быстрых приложений для лабораторий!Я люблю это без серверной технологии, пожалуйста, НЕ ОСТАНАВЛИВАЙТЕ это !!