PHP cURL: Codierung / Analyse (AWS Neptune mit SPARQL)

Sep 16 2020

Ich bin neu in SPARQL, daher ist dies möglicherweise eine dumme Frage, aber ich habe Probleme beim Einfügen von Daten. Ich verwende den HTTPS-REST-Endpunkt, um mit der Datenbank zu kommunizieren.

Ich habe das folgende Triple:

<urn:data:Gen`000001>
<urn:data:content>
"This is a literal"

Was ich, urlencode()weil es mir, wie ich dachte, keine Fehler geben würde, da es das richtige URI-Format hat:

<urn:data:Gen%60000001>
...

Das% -Zeichen löst jedoch den Fehler aus (denn wenn ich ein -anstelle des Zeichens verwende %, funktioniert es). Aufgrund dieser Antwort habe ich versucht, das %Zeichen rückwärts zu streichen :

<urn:data:Gen\%60000001>
...

Dann habe ich versucht, eine URL anstelle der URN zu verwenden:

<https://test.com/data/Gen%60000001>
<https://test.com/data/content>
...

Aber es gibt mir immer den gleichen Fehler:

The requested URL returned error: 400 Bad Request

Also, was mache ich falsch? Wie kann ich dem %Zeichen (und möglicherweise anderen Urlencode-Zeichen) entkommen? Oder sollte ich fragen: Ist dies der richtige Weg, dies urlencode()vor dem Absenden zu tun ?

BEARBEITEN:

mein PHP Code:

$q = 'update=INSERT DATA { '. '<https://test.com/data/Gen%60000001> '. '<https://test.com/data/content> '. '"This is a literal." }'; $ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$config->db->public->neptune->cluster."/sparql");
curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3); curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $q);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $server_output = curl_exec($ch); if (curl_errno($ch)) {
    $error = curl_error($ch);
}

if(!$error) echo $server_output;
else
    echo $error;

Wieder, wenn ich nur dazu wechsle %, -funktioniert es:

query=select * where {?s ?p ?o}
result:
  "s" : {
    "type" : "uri",
    "value" : "https://test.com/data/Gen-60000001"
  },
  "p" : {
    "type" : "uri",
    "value" : "https://test.com/data/content"
  },
  "o" : {
    "type" : "literal",
    "value" : "This is a literal."
  }

EDIT2 + Lösung:

Wie Kelvin Lawrence betonte, handelt es sich wahrscheinlich um ein Parsing- / Codierungsproblem auf PHP-Seite. Ich habe das gelöscht CURLOPT_FAILONERRORund jetzt werden folgende Fehler angezeigt:

using URN:
    {
        "detailedMessage":"Malformed query: Lexical error at line 1, column 28. 
            Encountered: \"`\" (96), after : \"\"",
        "requestId":"***",
        "code":"MalformedQueryException"
    }

using URL:
    {
        "detailedMessage":"Malformed query: Lexical error at line 1, column 32. 
            Encountered: \"/\" (47), after : \"test.com\"",
        "requestId":"***",
        "code":"MalformedQueryException"}

Es sieht so aus, als ob der Fehler bei der Verwendung des URN zeigt, dass Neptune ihn als Originalzeichen empfängt (oder dekodiert), bevor ich ihn urlencodiert habe. Wenn ich es also vor dem Senden noch einmal urlencode, funktioniert es wie es sollte:

$q = 'update=INSERT DATA { '.
        '<https://test.com/data/'.urlencode(urlencode('Gen`60000001')).'> '.
        '<https://test.com/data/content> '.
        '"This is a literal." }';

Aber warum empfängt Neptun es entschlüsselt oder warum entschlüsselt es es? Es wird im POST-Body gesendet, damit es nicht dekodiert werden muss, oder? Was vermisse ich?

EDIT3:

Eine andere Sache, die ich erwähnen sollte:

$q = 'query=select * where {?s ?p ?o}';

Diese Abfrage funktioniert einwandfrei, während dieselbe Abfrage mit Zeilenumbrüchen nicht funktioniert:

$q = 'query=select * 
        where {
            ?s
            ?p 
            ?o
        }';

Es gibt mir diesen Fehler:

{
    "detailedMessage":"Malformed query: Encountered \"\" at line 1, column 9.\n
        Was expecting one of:\n    \"{\" ...\n    \"from\" ...\n    \"where\" ...\n    
        \"with\" ...\n    ",
    "requestId":"***",
    "code":"MalformedQueryException"
}

Warum? Ich kann das lösen, indem ich die Abfrage in einer Zeile halte, aber so sollte es nicht funktionieren.

Antworten

osomanden Sep 25 2020 at 16:09

Versuchen Sie, base64_encode / decode zu verwenden. Das Übertragen von Daten zwischen PHP-Dateien funktioniert bei mir so

Datei A: $string = "sadfkjæ4#%"#¤%"; $string_for_transfer = base64_encode ($ string);

Datei B:

$string = $_GET["string"]; $string_data = base64_decode($string); echo $string_data;

gibt:

sadfkjæ4#%"#¤%