OBS/Kostenpflichtige Module/RESTServer/Beispiel4: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „Скачать [http://fstoexua.ru/film/136/ Пираты карибского Моря 5 2017 Мертвецы смотреть] Карибского Моря…“)
 
(Die Seite wurde neu angelegt: „{{Kostenpflichtige Module}} = Beispiel 4 – Pfad-Parameter (REST-Routing über Templates) = Dieses Beispiel zeigt das '''Pfad-Template-Routing''' mit Platzhaltern. Eine Auftrags-Ressource wird über drei Endpunkte abgebildet: {| class="wikitable" ! Methode + Pfad !! Zweck |- | <code>GET /orders</code> || Liste aller offenen Aufträge |- | <code>GET /orders/{uid}</code> || Einzelner Auftrag per UID |- | <code>PUT /orders/{uid}/modules/{code}</code> || S…“)
Zeile 1: Zeile 1:
Скачать [http://fstoexua.ru/film/136/ Пираты карибского Моря 5 2017 Мертвецы смотреть] Карибского Моря 5 посмотреть фильм Пираты Карибского моря 5<br><br>http://fstoexua.ru/film/136/<br><br>%random_video%<br>Скачать Пираты Карибского Моря 5<br>Пираты Карибского Моря 5 Смотреть Онлайн Смотреть Фильмы Онлайн Пираты Карибского Моря 5 Фильм Пираты Карибского Моря 5 Мертвецы Скачать Пираты Карибского Моря 5 Скачать Пираты Карибского Моря 5<br>http://megogoserial.ru/zhenskiy-doktor-35-seriya-smotret-onlayn/smotret-online-hd-720-p-megogo http://megogoserial.ru/revolyuciya-z-sezon-1-epizod-12-21-05-2017-na-russkom/smotret-online-hd-720-p-megogo http://megogoserial.ru/kuhnya-4-sezon-18-21-05-2017-skachat-torrent-vse-serii-kuhnya-4-sezon-18/smotret-online-hd-720-p-megogo http://megogoserial.ru/skins-7-sezon-1-seriya-21-05-2017-novye-serii-smot/smotret-online-hd-720-p-megogo http://megogoserial.ru/domrabotnica-film-2011-21-05-2017-na-russkom-yazy/smotret-online-hd-720-p-megogo http://megogoserial.ru/dnevnicite-na-vampira-sezon-4-epizod-5-21-05-2017/smotret-online-hd-720-p-megogo http://megogoserial.ru/brigada-seriya-12-21-05-2017-vse-serii-podryad-skach/smotret-online-hd-720-p-megogo http://megogoserial.ru/svaty-sezon-2-seriya-1-21-05-2017-sezon-vse-serii-s/smotret-online-hd-720-p-megogo http://megogoserial.ru/kukhnya-1-sezon-20-seriya-smotret-onlayn-21-05-2017/smotret-online-hd-720-p-megogo http://[http://www.becomegorgeous.com/topics/megogoserial megogoserial].ru/pomadnye-dzhungli-2-sezon-smotret-onla-3/smotret-online-hd-720-p-megogo
{{Kostenpflichtige Module}}
= Beispiel 4 – Pfad-Parameter (REST-Routing über Templates) =
 
Dieses Beispiel zeigt das '''Pfad-Template-Routing''' mit Platzhaltern. Eine
Auftrags-Ressource wird über drei Endpunkte abgebildet:
 
{| class="wikitable"
! Methode + Pfad !! Zweck
|-
| <code>GET /orders</code> || Liste aller offenen Aufträge
|-
| <code>GET /orders/{uid}</code> || Einzelner Auftrag per UID
|-
| <code>PUT /orders/{uid}/modules/{code}</code> || Status eines Auftrags-Moduls ändern
|}
 
Die Platzhalter <code>{uid}</code> und <code>{code}</code> stehen im Skript als
<code>oParams.Values['_OBS_PATH_uid']</code> bzw.
<code>oParams.Values['_OBS_PATH_code']</code> zur Verfügung.
 
== Einrichtung in OBS ==
 
* '''Server-Profil:''' Standard-TLS-Profil ''Public-API'' auf <code>0.0.0.0:443</code>.
* '''Zugang:''' ''Orders-Client'' mit API-Key, Zugriff auf die drei Endpunkte.
* '''Endpunkte''' (je ein Eintrag in <code>RESTSRV_ENDPOINTS</code>, alle Profil ''Public-API''):
 
{| class="wikitable"
! Endpunkt !! Pfad-Template !! Skript-Methode
|-
| <code>orders</code> || <code>/orders</code> || <code>Get</code> (Liste)
|-
| <code>orders</code> || <code>/orders/{uid}</code> || <code>Get</code> (Einzel)
|-
| <code>orders</code> || <code>/orders/{uid}/modules/{code}</code> || <code>Put</code>
|}
 
{{Hinweis|Das Feld '''Endpunkt''' (<code>re_endpoint</code>) ist nur informativ –
geroutet wird ausschließlich über das '''Pfad-Template'''. Die Berechtigung wird
pro Eintrag vergeben, sodass z.&nbsp;B. das ändernde <code>PUT</code> einem anderen
Zugang vorbehalten werden kann als die lesenden <code>GET</code>-Endpunkte.}}
 
== Endpunkt-Skript 1: <code>GET /orders</code> (Liste) ==
 
<syntaxhighlight lang="pascal">
// Hilfsfunktion: ein Auftrag als JSON-Objekt
function _OrderAsJSON(qOrder: TqSQL): TJSONObject;
begin
    result := TJSONObject.Create();
    result.AddPair('uid'      , qOrder.A2UID());
    result.AddPair('nr'      , qOrder.A2C('au_nr'));
    result.AddPair('kunde'    , qOrder.A2C('au_kunde'));
    result.AddPair('status'  , qOrder.A2C('au_status'));
    result.AddPair('aenderung', DTToSQL(qOrder.A2D('au_aend_dat')));
end;
 
function Get(oParams: TStrings; oBody: TJSONObject): string;
var cSql : string;
    qData: TqSQL;
    oArr : TJSONArray;
begin
    oArr := TJSONArray.Create();
 
    cSql := 'SELECT * FROM auftraege' +
            ' WHERE au_status <> ' + DB_SQLVal('9') +
            ' ORDER BY au_nr';
    if (DB_SOpen('Y00ORDLST1', oDB, cSql, qData)) then begin
        while (not qData.EoF) do begin
            oArr.Add(_OrderAsJSON(qData));
            qData.Next();
        end;
    end;
 
    result := oArr.ToJSON();
end;
</syntaxhighlight>
 
== Endpunkt-Skript 2: <code>GET /orders/{uid}</code> (Einzel) ==
 
<syntaxhighlight lang="pascal">
function _OrderAsJSON(qOrder: TqSQL): TJSONObject;
begin
    result := TJSONObject.Create();
    result.AddPair('uid'      , qOrder.A2UID());
    result.AddPair('nr'      , qOrder.A2C('au_nr'));
    result.AddPair('kunde'    , qOrder.A2C('au_kunde'));
    result.AddPair('status'  , qOrder.A2C('au_status'));
    result.AddPair('aenderung', DTToSQL(qOrder.A2D('au_aend_dat')));
end;
 
function Get(oParams: TStrings; oBody: TJSONObject): string;
var cUid : string;
    cSql : string;
    qData: TqSQL;
begin
    // Pfad-Parameter aus /orders/{uid}
    cUid := oParams.Values['_OBS_PATH_uid'];
    if (cUid = '') then begin
        result := '{"error":"uid fehlt"}';
        exit;
    end;
 
    cSql := 'SELECT * FROM auftraege WHERE sys_uid = ' + DB_SQLVal(cUid);
    if (DB_SOpen('Y00ORDGET1', oDB, cSql, qData)) and (not qData.EoF) then begin
        result := _OrderAsJSON(qData).ToJSON();
    end else begin
        result := '{"error":"Auftrag nicht gefunden"}';
    end;
end;
</syntaxhighlight>
 
== Endpunkt-Skript 3: <code>PUT /orders/{uid}/modules/{code}</code> ==
 
<syntaxhighlight lang="pascal">
function Put(oParams: TStrings; oBody: TJSONObject): string;
var cUid  : string;
    cCode  : string;
    cStatus: string;
    cSql  : string;
    qChk  : TqSQL;
    xMod  : TqSQL;
begin
    // Beide Pfad-Parameter
    cUid  := oParams.Values['_OBS_PATH_uid'];
    cCode := oParams.Values['_OBS_PATH_code'];
    if (cUid = '') or (cCode = '') then begin
        result := '{"error":"uid oder code fehlt"}';
        exit;
    end;
 
    // Nutzdaten kommen aus dem JSON-Body
    cStatus := '';
    if (Assigned(oBody)) then begin
        oBody.TryGetValue<string>('status', cStatus);
    end;
    if (cStatus = '') then begin
        result := '{"error":"status fehlt"}';
        exit;
    end;
 
    // Existenzpruefung
    cSql := 'SELECT * FROM auftrag_module' +
            ' WHERE am_auftrag = ' + DB_SQLVal(cUid) +
            ' AND am_code = ' + DB_SQLVal(cCode);
    if (not DB_SOpen('Y00ORDMOD1', oDB, cSql, qChk)) or (qChk.EoF) then begin
        result := '{"error":"Modul nicht gefunden"}';
        exit;
    end;
 
    // Update
    xMod := qSqlRead('Y00ORDMOD2', oDB, 'auftrag_module',
                    'am_auftrag = ' + DB_SQLVal(cUid) +
                    ' AND am_code = ' + DB_SQLVal(cCode));
    xMod.qSet('am_status', cStatus);
    xMod.SaveData(UPDATE_RECORD);
    qSqlFree(xMod);
 
    result := '{"status":"ok"}';
end;
</syntaxhighlight>
 
== Test mit curl ==
 
<syntaxhighlight lang="bash">
# Liste
curl -H "apikey: GEHEIM123" https://api.meinserver.de/orders
 
# Einzelner Auftrag (uid als Pfad-Parameter)
curl -H "apikey: GEHEIM123" https://api.meinserver.de/orders/4711
 
# Modul-Status aendern (uid + code als Pfad-Parameter, status im Body)
curl -X PUT \
    -H "apikey: GEHEIM123" \
    -H "Content-Type: application/json" \
    -d '{"status":"21"}' \
    https://api.meinserver.de/orders/4711/modules/A1
</syntaxhighlight>
 
== Was dieses Beispiel zeigt ==
 
* '''Eine Ressource, mehrere Pfad-Formen''' über getrennte Endpunkt-Einträge mit eigenem Skript und eigener Berechtigung.
* '''Pfad-Parameter''' werden über <code>{name}</code> im Template erfasst und im Skript als <code>oParams.Values['_OBS_PATH_name']</code> gelesen.
* Reihenfolge der Skript-Parameter: '''<code>oParams</code> zuerst, <code>oBody</code> danach''' (umgekehrt zur internen Dispatch-Reihenfolge).
* Präzedenz: ein statisches Segment (z.&nbsp;B. <code>/orders/summary</code>) hätte Vorrang vor <code>/orders/{uid}</code>.
 
== Siehe auch ==
 
* [[/OBS/Kostenpflichtige_Module/RESTServer/Endpunkte|Endpunkte]]
* [[/OBS/Kostenpflichtige_Module/RESTServer/Scripting|Scripting]]

Version vom 15. Juni 2026, 08:00 Uhr

Kostenpflichtige Module

Internet-Shop
UPS
IMS Professional
SMS
Mehrlager-Verwaltung
Mehrsprachen Modul
Multilanguage Modul
EVA Marketing Tool
Termin-Projekte
Edifact-Schnittstelle
Backup Überwachung Email
OBS Geo Daten
DeliSprint / DPD
Filialen
Cashback
Moebelschnittstelle
Dokumenten Manager
DocuWare-Schnittstelle
OFML-Kalkulation
Versicherungsschaden
Gutschriftsanzeigen
Kameraverwaltung
DataInOut
OpenMasterData / IDS
Sammelpositionen


Beispiel 4 – Pfad-Parameter (REST-Routing über Templates)

Dieses Beispiel zeigt das Pfad-Template-Routing mit Platzhaltern. Eine Auftrags-Ressource wird über drei Endpunkte abgebildet:

Methode + Pfad Zweck
GET /orders Liste aller offenen Aufträge
GET /orders/{uid} Einzelner Auftrag per UID
PUT /orders/{uid}/modules/{code} Status eines Auftrags-Moduls ändern

Die Platzhalter {uid} und {code} stehen im Skript als oParams.Values['_OBS_PATH_uid'] bzw. oParams.Values['_OBS_PATH_code'] zur Verfügung.

Einrichtung in OBS

  • Server-Profil: Standard-TLS-Profil Public-API auf 0.0.0.0:443.
  • Zugang: Orders-Client mit API-Key, Zugriff auf die drei Endpunkte.
  • Endpunkte (je ein Eintrag in RESTSRV_ENDPOINTS, alle Profil Public-API):
Endpunkt Pfad-Template Skript-Methode
orders /orders Get (Liste)
orders /orders/{uid} Get (Einzel)
orders /orders/{uid}/modules/{code} Put
HINWEIS: Das Feld Endpunkt (re_endpoint) ist nur informativ –

geroutet wird ausschließlich über das Pfad-Template. Die Berechtigung wird pro Eintrag vergeben, sodass z. B. das ändernde PUT einem anderen

Zugang vorbehalten werden kann als die lesenden GET-Endpunkte.

Endpunkt-Skript 1: GET /orders (Liste)

// Hilfsfunktion: ein Auftrag als JSON-Objekt
function _OrderAsJSON(qOrder: TqSQL): TJSONObject;
begin
    result := TJSONObject.Create();
    result.AddPair('uid'      , qOrder.A2UID());
    result.AddPair('nr'       , qOrder.A2C('au_nr'));
    result.AddPair('kunde'    , qOrder.A2C('au_kunde'));
    result.AddPair('status'   , qOrder.A2C('au_status'));
    result.AddPair('aenderung', DTToSQL(qOrder.A2D('au_aend_dat')));
end;

function Get(oParams: TStrings; oBody: TJSONObject): string;
var cSql : string;
    qData: TqSQL;
    oArr : TJSONArray;
begin
    oArr := TJSONArray.Create();

    cSql := 'SELECT * FROM auftraege' +
            ' WHERE au_status <> ' + DB_SQLVal('9') +
            ' ORDER BY au_nr';
    if (DB_SOpen('Y00ORDLST1', oDB, cSql, qData)) then begin
        while (not qData.EoF) do begin
            oArr.Add(_OrderAsJSON(qData));
            qData.Next();
        end;
    end;

    result := oArr.ToJSON();
end;

Endpunkt-Skript 2: GET /orders/{uid} (Einzel)

function _OrderAsJSON(qOrder: TqSQL): TJSONObject;
begin
    result := TJSONObject.Create();
    result.AddPair('uid'      , qOrder.A2UID());
    result.AddPair('nr'       , qOrder.A2C('au_nr'));
    result.AddPair('kunde'    , qOrder.A2C('au_kunde'));
    result.AddPair('status'   , qOrder.A2C('au_status'));
    result.AddPair('aenderung', DTToSQL(qOrder.A2D('au_aend_dat')));
end;

function Get(oParams: TStrings; oBody: TJSONObject): string;
var cUid : string;
    cSql : string;
    qData: TqSQL;
begin
    // Pfad-Parameter aus /orders/{uid}
    cUid := oParams.Values['_OBS_PATH_uid'];
    if (cUid = '') then begin
        result := '{"error":"uid fehlt"}';
        exit;
    end;

    cSql := 'SELECT * FROM auftraege WHERE sys_uid = ' + DB_SQLVal(cUid);
    if (DB_SOpen('Y00ORDGET1', oDB, cSql, qData)) and (not qData.EoF) then begin
        result := _OrderAsJSON(qData).ToJSON();
    end else begin
        result := '{"error":"Auftrag nicht gefunden"}';
    end;
end;

Endpunkt-Skript 3: PUT /orders/{uid}/modules/{code}

function Put(oParams: TStrings; oBody: TJSONObject): string;
var cUid   : string;
    cCode  : string;
    cStatus: string;
    cSql   : string;
    qChk   : TqSQL;
    xMod   : TqSQL;
begin
    // Beide Pfad-Parameter
    cUid  := oParams.Values['_OBS_PATH_uid'];
    cCode := oParams.Values['_OBS_PATH_code'];
    if (cUid = '') or (cCode = '') then begin
        result := '{"error":"uid oder code fehlt"}';
        exit;
    end;

    // Nutzdaten kommen aus dem JSON-Body
    cStatus := '';
    if (Assigned(oBody)) then begin
        oBody.TryGetValue<string>('status', cStatus);
    end;
    if (cStatus = '') then begin
        result := '{"error":"status fehlt"}';
        exit;
    end;

    // Existenzpruefung
    cSql := 'SELECT * FROM auftrag_module' +
            ' WHERE am_auftrag = ' + DB_SQLVal(cUid) +
            ' AND am_code = ' + DB_SQLVal(cCode);
    if (not DB_SOpen('Y00ORDMOD1', oDB, cSql, qChk)) or (qChk.EoF) then begin
        result := '{"error":"Modul nicht gefunden"}';
        exit;
    end;

    // Update
    xMod := qSqlRead('Y00ORDMOD2', oDB, 'auftrag_module',
                     'am_auftrag = ' + DB_SQLVal(cUid) +
                     ' AND am_code = ' + DB_SQLVal(cCode));
    xMod.qSet('am_status', cStatus);
    xMod.SaveData(UPDATE_RECORD);
    qSqlFree(xMod);

    result := '{"status":"ok"}';
end;

Test mit curl

# Liste
curl -H "apikey: GEHEIM123" https://api.meinserver.de/orders

# Einzelner Auftrag (uid als Pfad-Parameter)
curl -H "apikey: GEHEIM123" https://api.meinserver.de/orders/4711

# Modul-Status aendern (uid + code als Pfad-Parameter, status im Body)
curl -X PUT \
     -H "apikey: GEHEIM123" \
     -H "Content-Type: application/json" \
     -d '{"status":"21"}' \
     https://api.meinserver.de/orders/4711/modules/A1

Was dieses Beispiel zeigt

  • Eine Ressource, mehrere Pfad-Formen über getrennte Endpunkt-Einträge mit eigenem Skript und eigener Berechtigung.
  • Pfad-Parameter werden über {name} im Template erfasst und im Skript als oParams.Values['_OBS_PATH_name'] gelesen.
  • Reihenfolge der Skript-Parameter: oParams zuerst, oBody danach (umgekehrt zur internen Dispatch-Reihenfolge).
  • Präzedenz: ein statisches Segment (z. B. /orders/summary) hätte Vorrang vor /orders/{uid}.

Siehe auch