JSON API Parameter type mismatch

Ich kämpfe gerade damit der JSON API die richigen Typen mitzugeben. Leider bekomme ich immer einen Parameter Typ Fehler.

$res=$ips->FHT_SetTemperature((integer)57833,(float)22.5);

darin


public function __call($name, $arguments) {
   
   $this->error=null;
   $this->method=$method;
   $rpc = Array(
         "jsonrpc" => "2.0",
         "method" => $name,
         "params" => $arguments,
         "id" => "null"
		);
   
		array_walk_recursive($rpc, function(&$item, $key){
			if ( is_string($item) )
				$item = utf8_encode($item);
		});

$content=json_encode($rpc);
		$result = file_get_contents($this->url, false, stream_context_create(
		    array('http' =>
		        array(
		        'method'  => 'POST',
		        'header'  => 'Content-type: application/json; charset=utf-8',
		        'content' => $content
		        )
		    )
		));

wobei $content dabei wie folgt gebildet wird

{"jsonrpc":"2.0","method":"FHT_SetTemperature","params":[57833,22.5],"id":"null"}

Antwort in $result dann:


{"id":"null","error":{"message":"FHT_SetTemperature: Parameter type mismatch!","code":"-32603"},"jsonrpc":"2.0"}

Wie kann ich die API überzeugen, das der Typ richtig ist?

Tommi

Das ist ein Bug. Fix im nächsten Update. (#IPSD-26)

paresy

Danke! Ich bin schon verzweifelt.

Wobei mir schleierhaft ist, wie Du die Unterscheidung zwischen Integer und Float hinbekommst. Der JSON Standard kennt doch nur „Number“. In Perl kann ich wahrscheinlich deswegen auch keine 22.0 übergeben, höchstens als String, ansonsten macht das JSON Modul konsequent immer 22 draus.

Tommi

Hallo,

ich hole den Thread mal hoch.

Ich versuche per httpie auf das json api zu zu greifen. Leider bekomme ich es nicht hin.

Mein Aufruf:

http --verbose POST http://admin:passwd@127.0.0.1/api/ method=GetValueFormatted params=null id=17733


POST /api/ HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate, compress
Authorization: Basic YWRtaW46RkwyNmF1ZyE=
Content-Length: 64
Content-Type: application/json; charset=utf-8
Host: admin:passwd@127.0.0.1
User-Agent: HTTPie/0.8.0-dev

{
    "id": "17733",
    "method": "GetValueFormatted",
    "params": "null"
}

HTTP/1.1 200 OK
Connection: close
Content-Encoding: gzip
Content-Length: 88
Content-Type: application/json; charset=utf-8
Date: Fri, 22 Nov 2013 07:23:04 GMT

{
    "error": {
        "code": "-32700",
        "message": "Parse error"
    },
    "id": null,
    "jsonrpc": "2.0"
}

Hat evtl. schon mal jemand den Aufruf gemacht und kann mir helfen?
Ist wahrscheinlich eine Kleinigkeit, aber ich komme nicht drauf.
Gruß
Christian

Schau mal in die specs: http://www.jsonrpc.org/specification

Eher sowas:


{
    "jsonrpc": "2.0",
    "id": "egal",
    "method": "GetValueFormatted",
    "params": [17733]
}

paresy

Hallo Paresy,

jetzt bekomme ich als Rückmeldung:


   "error": {
       "code": "-32600",
       "message": "Invalid request"
   },
   "id": null,
   "jsonrpc": "2.0"

Aufruf war wie von Dir vorgeschlagen.

Hast Du noch eine Idee?

Gruß
Christian

Hier läuft es. Du könntest noch versuchen den Content-Type auf application/json zu setzen.

paresy

Habe ich auch getestet:

http --verbose --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=GetValueFormatted params=[17733] id=null

Es kommt immer ein „Invalid Request“
Als Content Type wird „application/json“ mit „charset=utf-8“ angegeben.

Gruß
Christian

Priobier mal bei id einen Wert anzugeben. null ist zwar laut Specs valide, aber IPS 3.0 hätte gerne einen Wert. Das werde ich korrigieren :slight_smile:

paresy

Ich bekomme leider weiterhin einen „Invalid Request“

Gruß
Christian


http --verbose --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=GetValueFormatted params:='[17733]' id=1

Das sollte gehen.

paresy

Hallo paresy,

super danke. Es geht allerdings nur ohne die Anführungszeichen bei params.

also so:

http --verbose --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=GetValueFormatted params:=[17733] id=1

Dann geht auch id=null.
Es lag also an dem Doppelpunkt vor params.

Da wäre ich nie drauf gekommen.

Gruß
Christian

Hallo,

also entweder bin ich zu blöd, oder die Schnittstelle ist recht zickig:

http.exe --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=SetValue params:=[25181,test] id=null

liefert http: error: AttributeError: ‚ParseError‘ object has no attribute ‚message‘.

http.exe --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=SetValue params:='[25181,test]' id=null

liefert wieder ein "Invalid Request -32600.
Auch den String noch mal in Anführungszeichen setzen bringt keinen Erfolg. Ich habe jetzt alles mögliche durchprobiert, komme aber auf keine Lösung.

Könnte noch mal jemand mit schauen?

Gruß
Christian


http.exe --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=SetValue params:=[25181,"test"] id=null

Wenn bei Params := nutzt musst du korrektes JSON angeben. Du kannst es jederzeit hier validieren: http://jsonlint.com/
Da ist dann übrigens das HTTPie Tool sehr genau. Nicht die API. Aber die API will es auch alles korrekt haben :wink:

paresy

Hallo Paresy,

mit Deinem Aufruf bekomme ich einen „Parse error no Attribute Message“.
Wenn ich die Parameter so aufbaue, das der json Validierer sagt ok bleibt es bei einem Parse error.

Habe auch id=1 getestet, und wieder einige anderes Versionen.

Gruß
Christian


http.exe --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=SetValue params:='[25181,"test"]' id=null

So auch nicht? Die Fehlermeldung kommt auf jeden Fall von HTTPie. Wenn Invalid Request kommt, kommt es von IPS. Kannst du mir mit dem o.g. Befehl diese Debug-Ausgabe vom ersten Beitrag reinkopieren, sofern Invalid Request kommt?

paresy

Es kommt aber leider ein „Parse error“.

Ich habe alternativ eine test.json erzeugt, mit folgendem Inhalt:

[25181,"test2"]

Aufruf ist dann:

http.exe --json POST http://user:passwd@127.0.0.1/api/ jsonrpc=2.0 method=SetValue params:=@test.json id=null

Und das geht. Ich gehe also derzeit davon aus, dass httpie einen Fehler macht, oder hast Du noch eine andere Idee?

Gruß
Christian