2016-05-04 11 views
-1

senden Ich kann nicht unserstand, was ich falsch mache, aber wenn ich nächste Anfrage mit curl schicke, erhalte ich Fehler:ArangoDB nicht Anfrage mit curl

echo {"id":1,"question":"aaa"},{"id":2,"question":"bbb?"} | curl -X POST --data-binary @- --dump - http://localhost:8529/_db/otest/_api/document/?collection=sitetestanswers 


HTTP/1.1 100 (Continue) 

HTTP/1.1 400 Bad Request 
Server: ArangoDB 
Connection: Keep-Alive 
Content-Type: application/json; charset=utf-8 
Content-Length: 100 

{"error":true,"errorMessage":"failed to parse json object: expecting EOF","code":400,"errorNum":600} 

Irgendwelche Ideen? Ich band wickeln es ist [ ... ]. Nichts hilft nicht. Mit [ ... ] Validator Marke diese als gültig

Same mit D. Dies ist mein Code:

void sendQuestionsToArangoDB(Json questions) 
{ 
    string collectionUrl = "http://localhost:8529/_db/otest/_api/document/?collection=sitetestanswers"; 

    auto rq = Request(); 
    rq.verbosity = 2; 
    string s = `{"id":"1","question":"foo?"},{"id":2}`; 
    auto rs = rq.post(collectionUrl, s, "application/json"); 
    writeln("SENDED"); 
} 

-

POST /_db/otest/_api/document/?collection=sitetestanswers HTTP/1.1 
Content-Length: 37 
Connection: Close 
Host: localhost:8529 
Content-Type: application/json 

HTTP/1.1 400 Bad Request 
Server: ArangoDB 
Connection: Close 
Content-Type: application/json; charset=utf-8 
Content-Length: 100 
100 bytes of body received 

Für DI diese lib verwenden: https://github.com/ikod/dlang-requests Same Problem mit Vibed.

+0

Zeigen Sie den curl Befehl, zumindest (sollte in DB angelegt werden)! Und reduzieren Sie es auf das erforderliche Minimum, um das Problem zu reproduzieren - ich kann nicht einmal so lange auf meinem Telefon scrollen. –

+0

Können Sie Ihre Antwort als "akzeptiert" markieren, wenn das Problem für Sie behoben wurde? – dothebart

Antwort

1
echo '[{"id":1,"question":"aaa"},{"id":2,"question":"bbb?"}]' 

sollte den Trick tun. Sie müssen Ticks um den JSON legen. Die Array-Klammern sind notwendig, andernfalls ist dies kein gültiger JSON.

+0

Wie folgt: 'echo '[{" id ": 1," Frage ":" aaa "}, {" id ": 2," Frage ":" bbb? "}]' | curl -X POST --databinär @ - --dump - http: // localhost: 8529/_db /otest/_api/document /?collection = sitetestanswers'? Gleiches Ergebnis :( –

+1

Das ist, was ich zurückbekomme: [{"_id": "sitetestanswers/939", "_ key": "939", "_ rev": "939"}, {"_ id": "sitetestanswers/943 "," _ key ":" 943 "," _ rev ":" 943 "}]. ich schneide und klebte deinen Beitrag hier. –

+0

was kann falsch sein? Irgendwelche Ideen? http://img.ctrlv.in/img /16/05/04/572a5d4335db6.png –

1

Sie versuchen, mehrere Dokumente zu senden. Die Daten in der ursprünglichen Frage trennt die Dokumente durch Komma ({"id":1,"question":"aaa"},{"id":2,"question":"bbb?"}), die ungültige JSON ist. So die failed to parse json object Antwort von ArangoDB.

Wenn Sie die Dokumente in eckige Klammern setzen ([ ... ]), wie einige der vorgeschlagenen Kommentatoren, wird die Anfrage Payload JSON erneut gültig machen.

Sie senden die Daten jedoch an einen Serverendpunkt, der ein einzelnes Dokument verarbeitet. Die API für POST /_api/document/?collection=... akzeptiert derzeit jeweils nur ein Dokument. Es funktioniert nicht mit mehreren Dokumenten in einer einzigen Anfrage. Es erwartet ein JSON-Objekt, und wenn es etwas anderes gesendet wird, wird es mit einem Fehlercode antworten.

Wenn Sie sich für die Batch-Einsätze suchen, versuchen Sie bitte die API POST /_api/import, hier im Handbuch beschrieben: https://docs.arangodb.com/HttpBulkImports/ImportingSelfContained.html

Dies wird in einer einzigen Anfrage mit mehreren Dokumenten arbeiten. ArangoDB 3.0 ermöglicht auch das Senden mehrerer Dokumente an die POST /_api/document?collection=... API, aber diese Version ist noch nicht freigegeben. Eine technische Vorschau wird jedoch bald verfügbar sein.

3

ArangoDB verstehe JSON nicht, wenn es Array wie [...] kommt. Es sollte als Schlüsselwert übergeben werden. Wenn Sie ein Pass-Array benötigen, sollte es den Schlüssel mykey : [] haben.

Hier arbeitet Code:

import std.stdio; 
import requests.http; 

void main(string[] args) 
{ 
    string collectionUrl = "http://localhost:8529/_db/otest/_api/document?collection=sitetestanswers"; 

    auto rq = Request(); 
    rq.verbosity = 2; 
    string s = `{"some_data":[{"id":1, "question":"aaa"},{"id":2, "question":"bbb"}]}`; 
    auto rs = rq.post(collectionUrl, s, "application/json"); 
    writeln("SENDED"); 
} 

otest - DB-Namen

sitetestanswers - Kollektionsnamen