_find запрос не работает в IBM Cloudant - PullRequest
0 голосов
/ 29 мая 2018

Я использую 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:

enter image description here

РЕДАКТИРОВАТЬ 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>

enter image description here

РЕДАКТИРОВАТЬ 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 настолько полезна для создания быстрых приложений для лабораторий!Я люблю это без серверной технологии, пожалуйста, НЕ ОСТАНАВЛИВАЙТЕ это !!

1 Ответ

0 голосов
/ 30 мая 2018

При отладке подобных файлов сначала я проверю, работает ли ваш запрос с панели управления Cloudant или из командной строки:

curl -X POST \ 
  -d'{"selector": { "cp": 24000}}' \ 
  -H'Content-type: application/json' \
 "https://USERNAME:PASSWORD@HOST.cloudant.com/etablissements/_find"

Ответ: «Да, это работает!».Вы получаете обратно объект, который содержит {"docs": [ ... ]} с массивом документов.

Поэтому я приступил к тестированию вашего кода jQuery, и он будет работать, если вы удалите мошенника } в функции success:

<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://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);
      }
   });
   </script>
</body>
</html>

NB. Пожалуйста, не публикуйте свои учетные данные Cloudant в открытом доступе.

...