2017-02-15 3 views
0

Ich versuche, ein einfaches JSON-Objekt an eine Cloud-Datenbank zu senden, aber ich bekomme immer einen Fehler. Ich setze die Berechtigungen für die Cloudant-Datenbank so, dass sie Lesen, Schreiben und Replizieren erlauben. Ich habe bereits versucht, den Ajax-Beitrag neu zu schreiben, um zu setzen, fügte ich einen Header, der den Fehler nicht gelöst hat, aber ich bekomme den Fehler, und kann nicht scheinen, die Ursache zu finden.Fehler 415 JSON-Datei in Cloudant öffentliche Datenbank

Der genaue Fehler ist:

POST https://birdoftravel.cloudant.com/questions/_all_docs/ 415 (Unsupported Media Type) 
send @ jquery-1.12.4.min.js:4 
ajax @ jquery-1.12.4.min.js:4 
saveQuestionToDB @ saveQuestion.js:54 
(anonymous) @ saveQuestion.js:77 
dispatch @ jquery-1.12.4.min.js:3 
r.handle @ jquery-1.12.4.min.js:3 

function QuestionObject(q, o, a){ 
 
    this.question = q; 
 
    this.options = o; 
 
    this.answer = a; 
 
    
 
} 
 

 

 
function createQuestion(){ 
 
    
 
    var q = $('#question').val(); 
 
    console.log("question: "+q); 
 
    var o = $('#options').val().split(','); 
 
    
 
    var a = $('#answer').val(); 
 
    
 
    var question = new QuestionObject(q,o,a); 
 
    
 
    var jsonQ = JSON.stringify(question); 
 
    
 
    console.log("json string"+jsonQ); 
 
    
 
    $('#question').val(""); 
 
    $('#options').val(""); 
 
    $('#answer').val(""); 
 
    
 
    return jsonQ; 
 
    
 
} 
 

 
function saveQuestionToDB(){ 
 
    var urlDB = 'https://birdoftravel.cloudant.com/questions/_all_docs/'; 
 
    var data = createQuestion(); 
 
    console.log("data :"+data); 
 
    
 
    /* $.ajax({ 
 
     
 
     url: urlDB, 
 
     type: "POST", 
 
     dataType: "application/json", 
 
     data: data, 
 
     success: function(){ 
 
      alert('The question was posted!'); 
 
     }, 
 
     
 
     error: function(err){ 
 
      console.log("error: "+err+" question not posted: "+data); 
 
     } 
 
     
 
    });*/ 
 
    
 
    $.ajax({ 
 
    
 
     type: "POST", 
 
    
 
     url: urlDB, 
 
    
 
     data: data, 
 
    
 
     success: function(d){ 
 
      console.log("question was posted!"+d); 
 
      
 
     }, 
 
     error: function(e){ 
 
      console.log("not posted! "+e); 
 
     }, 
 
      
 
    
 
     dataType: "application/json", 
 
     
 

 
    }); 
 
} 
 

 
$('#btn').click(function(e){ 
 
    saveQuestionToDB(); 
 
    e.preventDefault(); 
 
});
<!doctype html> 
 
<html> 
 
    <head> 
 
     <meta charset="utf-8"> 
 
     
 

 
    
 

 
     
 
     <link rel="stylesheet" href="quizStyle.css"> 
 
     <script 
 
       src="https://code.jquery.com/jquery-1.12.4.min.js" 
 
    
 
       integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" 
 
    
 
       crossorigin="anonymous"> 
 
     </script> 
 
     
 
     <title>Add a new quiz</title> 
 
    </head> 
 
    <body> 
 
     
 
     <h2>Enter a new quiz</h2> 
 
     
 
      <form id="newQuizForm"> 
 
     
 
       Insert question:<br> 
 
       <input type="text" id="question"><br> 
 
       Insert optional answers seperated by ;<br> 
 
       <input type="text" id="options"><br> 
 
       Insert correct answer:<br> 
 
       <input type="text" id="answer"><br> 
 
       <input type="submit" id="btn" value="Save question"> 
 
     
 
      </form> 
 
     
 
     
 
     <script src="saveQuestion.js"></script> 
 
    
 
    </body> 
 

 
</html>

Antwort

0

Sie sind die Anforderung an den falschen API-Endpunkt senden. Senden Sie eine POST Anfrage an https://birdoftravel.cloudant.com/questions (https://$USERNAME.cloudant.com/$DATABASE) und die Einfügeoperation sollte erfolgreich sein. Einzelheiten finden Sie unter https://console.ng.bluemix.net/docs/services/Cloudant/api/document.html#create.

Der Endpunkt Sie https://birdoftravel.cloudant.com/questions/_all_docs listet alle Dokumente in einer Datenbank unter Verwendung wurden: https://console.ng.bluemix.net/docs/services/Cloudant/api/database.html#get-documents

Die folgende modifizierte Version der JavaScript-Code für mich gearbeitet. Beachten Sie die Änderungen:

  • URL
  • Authorization-Header
  • Content-Type-Header

    function saveQuestionToDB(){ 
        var urlDB = 'https://<cloudant-user-name>.cloudant.com/questions'; 
        var data = createQuestion(); 
        console.log("data :"+data); 
    
        $.ajax({ 
         type: "POST", 
         beforeSend: function (xhr) { 
          xhr.setRequestHeader ("Authorization", "Basic " + btoa('<cloudant-user-name>' + ":" + '<cloudant-password>)); 
         }, 
         url: urlDB,   
         data: data, 
         success: function(d){ 
          console.log("question was posted!"+ JSON.stringify(d));     
         }, 
         error: function(j,t,s){ 
          console.log("not posted! "+ JSON.stringify(j)); 
          console.log("not posted! "+ JSON.stringify(t)); 
          console.log("not posted! "+ JSON.stringify(s)); 
         }, 
         contentType: "application/json" 
        }); 
    } 
    

Da Sie diese in einem Browser ausgeführt werden Sie müssen CORS sonst Ihre Anfrage zu ermöglichen, wird fehlschlagen: https://console.ng.bluemix.net/docs/services/Cloudant/api/cors.html#cors

+0

Auch wenn es geändert wird, bleibt es erhalten gibt den gleichen 415 Fehler. Ich habe auch versucht, einen Post mit Postboten zu senden, und ich bekomme den gleichen Fehler. { "Fehler": "bad_content_type", "Grund": "Content-Type muss application/json sein"} Ich aber ein Get Senden funktioniert wirklich nicht verstehen, warum es funktioniert nicht. – Karima

+0

Ich sende einen zusätzlichen Parameter für den Inhaltstyp an json, und jetzt gibt es einen Fehler bezüglich der utf-8 von json. – Karima

+0

Siehe Updates in meiner ursprünglichen Antwort. Um CORS in Cloudant zu aktivieren, öffnen Sie den Tab ** Account ** und wählen Sie ** CORS **. – ptitzler