OKAPI, POST, Body

Hier geht es um die Programmierung von Opencaching.de - User mit Erfahrungen im Bereich PHP, MySQL, HTML, JavaScript, CSS werden hier ständig gesucht
Antworten
hxdimpf
Nano
Nano
Beiträge: 16
Registriert: 14.12.2020, 12:11

bzgl OKAPI passiert nicht mehr viel auf der Plattform, weder in diesem Forum noch auf der Seite, die in der OKAPI docu verlinkt ist. Sicherlich ist das ganze als "functionally stabilized" anzusehen, ich probiere es dennoch mal hier:

In der Doc sagen sie egal ob GET oder POST. Mit "GET" habe ich bei meinen Experimenten bisher keine Probleme gehabt, aber was wenn ich z.B. den Service:

Code: Alles auswählen

https://www.opencaching.de/okapi/services/caches/save_personal_notes
nutzen moechte und was wenn die payload, also der "new_value" parameter ein 10kB langer Text ist? Das duerfte ziemlich sinnlos sein, das ueber URL parameter schieben zu wollen. Hier MUSS ein POST gemacht werden und mindestens "new_value" muss in den request body.

Eigentlich sollte es so sein: Die URL wird genauso geschickt wie oben, die Authorization geht in den Header und die Parameter in den Request Body.

Ich habe das auch soweit kodiert dass der server nicht mehr ueber Signature Probleme stolpert, aber er gibt mir eine 400 zurueck und:

Code: Alles auswählen

{"error":{"developer_message":"Required parameter 'cache_code' is missing.","reason_stack":["bad_request","missing_parameter"],"status":400,"parameter":"cache_code","more_info":"https://www.opencaching.de/okapi/introduction.html#errors"}}
d.h. er hat den request body ueberhaupt nicht verstanden, sucht vermutlich den fehlenden Parameter in der URL.

Nun die Fragen: Hat schon mal jemand das Konzept versucht, nackte URL als URL, Authorization im Header, Parameter im POST body?

Leider gibt es keine brauchbaren Beispiele.

Zur Vollstaendigkeit, hier mein request:

Code: Alles auswählen

const options = {
    method: 'POST',
    headers: {
      Authorization: oauthHeader,
      'Content-Type': 'application/json'
    },
    body : JSON.stringify({
      cache_code  : 'OCxxxxx',
      new_value   : 'xxx',
      old_value   : 'test1: bla'
    })
Benutzeravatar
mic@
Vereinsmitglied
Vereinsmitglied
Beiträge: 6623
Registriert: 04.12.2009, 00:31

Guten Morgen,

ich bin leider überhaupt kein OKAPI Experte, aber ich habe einem polnischen Entwickler
diesen Thread hier weitergeleitet. Vielleicht kann er ja helfen...

Ansonsten aber eine allgemeine Frage an Dich: Wieso interessiert Dich die OKAPI?
Normalerweise nutzt man diese Schnittstelle doch bloß, wenn man ein Tool plant (z.B. eine App),
mit der man auf die OC Datenbank zugreifen will. Hast Du so etwas geplant?

Happy caching, Mic@
hxdimpf
Nano
Nano
Beiträge: 16
Registriert: 14.12.2020, 12:11

Genau das ist das Ziel. Ich habe davon auch schon sehr viel Funktionalitaet am Laufen, hatte ich mal fuer die GC Variante es Spiels entwickelt aber die ruecken ja bekanntlich keine API keys mehr raus, also habe ich das aufgegeben.

Ich baue im Prinzip ein Frontend an OC dran, kann dann z.B. direkt vom Android phone aus cgeo fieldnotes, die OC codes beeinhalten direkt in meine App posten (dann isses mir auch wurscht ob OC.de die field notes parsen kann oder nicht parsen kann und ob Koordinaten in ein Feld gepastet werden koennen oder in 3 oder 6), sitze dann zuhause am WEB UI meiner App, compose in aller Ruhe fuer 50 caches meine Log Texte und schiesse sie mit einem OKAPI request bei euch in die database ;) Dazu muss ich natuerlich das Level 3 OKAPI beherrschen (und die Daten muessen in den request Body und nicht in die URL)

.... und das szenario mit den Logs ist nur das offensichtlichste und nur die Spitze des Eisberges. Den Rest hier zu diskutieren fuehrt zu weit, koenne wir aber gerne mal in einem privatissimo machen. Nur um klar zu sein: Ich habe natuerlich nicht wirklich vor, das komplette OC UI zu ersetzen, zuviel Aufwand fuer eine Person aber die Teile, die meinen Workflow ausmachen, da bietet mir die Webseite leider nicht das was ich im Lauf der letzten 10 Jahre mir bei GC erarbeitet habe. Im uebrigen tut auch die GC Plattform das nicht, weswegen ich ja anfing selbige fuer mich zu erweitern und da schliesst sich dann der Kreis, Stichwort API Keys.

Wenn ich soweit bin, werde ich mehr als cacher auf OC unterwegs sein als die 13 Funde in 10 Jahren ;)
hxdimpf
Nano
Nano
Beiträge: 16
Registriert: 14.12.2020, 12:11

Habe inzwischen in den sources gestoebert. Das von mir gewaehlte Beispiel landet da:

Code: Alles auswählen

okapi/okapi/services/caches/save_personal_notes/WebService.php
Und wenn ich mir den code anschaue:

Code: Alles auswählen

  public static function call(OkapiRequest $request)
    {
        # Get current notes, and verify cache_code

        $cache_code = $request->get_parameter('cache_code');
        if ($cache_code == null)
            throw new ParamMissing('cache_code');
... dann schwant mir uebles. zumindest "cache_code" scheint ausschliesslich in den query parms erwartet zu werden. Damit koennte ich sogar noch leben, denn der ist ueberschaubar kurz. Viel spannender ist dann "new_value",,,,

Dann das hier:

Code: Alles auswählen

 $old_value = $request->get_parameter('old_value');
        if ($old_value === null)
            $old_value = '';

        # new_value (force "no HTML" policy).

        $new_value = $request->get_parameter('new_value');
        if ($new_value === null)
            throw new ParamMissing('new_value');
Das sieht fue rmich so aus als ob man hier den "new_value" ausschliesslich in der URL erwartet. Aus dem Netz:
RFC 2616 (Hypertext Transfer Protocol — HTTP/1.1) states there is no limit to the length of a query string (section 3.2. 1). RFC 3986 (Uniform Resource Identifier — URI) also states there is no limit, but BigIP has limited the query string to magical max value, 1354. Any query string exceeding 1354 won't work.
Ich werde das mal testen, was OKAPI macht, wenn ich mal 10KB da rein schiebe. Wenns tut, dann solls mir wurscht sein obs ueber die query parms geht oder den body. Wenn es nicht geht, wurde OKAPI nie wirklich richtig exploited.


Ich werde das Ergebnis hier berichten ... stay tuned ....

P.S: An wen muesste ich mich wenden, wenn ich das Thema mit einem OKAPI Entwickler diskutieren wollte?
wrygiel
Beiträge: 1
Registriert: 13.06.2021, 15:55

Your POST body needs to be `application/x-www-form-urlencoded` (same format as HTML forms are sent in). JSON encoding for input params is not supported (and at the time OKAPI was written it was not a thing).
hxdimpf
Nano
Nano
Beiträge: 16
Registriert: 14.12.2020, 12:11

Thx much, tested it, works!
Benutzeravatar
mic@
Vereinsmitglied
Vereinsmitglied
Beiträge: 6623
Registriert: 04.12.2009, 00:31

hxdimpf hat geschrieben: 02.09.2023, 12:23P.S: An wen muesste ich mich wenden, wenn ich das Thema mit einem OKAPI Entwickler diskutieren wollte?
Die oc.de-Entwickler erreichst Du am besten über mattermost: https://devchat.opencaching.earth/main/ ... evelopment
Und die polnischen Entwickler (die ja auch die OKAPI erschaffen haben) erreichst Du über diese email-Adresse: rt /at/ opencaching.pl

HTH, Mic@
hxdimpf
Nano
Nano
Beiträge: 16
Registriert: 14.12.2020, 12:11

Danke fuer die Links. Bzgl. OKAPI hatte ich es mal ueber github versucht aber ich glaube dort liest niemand mehr wirklich mit.
Antworten