API‑ und OData-gebundene Aktionen

Abgeschlossen

Sie haben jetzt gelernt, wie Sie vorhandene Daten lesen und Daten erstellen oder aktualisieren. Sie haben auch die Möglichkeit, eine Prozedur über OData auszuführen. Da die API auf OData basiert, können Sie dieselbe Funktionalität in API‑ und OData v4-Webdiensten verwenden.

Sie können jedoch keine Prozedur auf einer API-Seite ausführen. Sie können Ihrem Verfahren ein Attribut [ServiceEnabled] mit WebServiceActionContext und WebServiceActionResultCode in Ihrer Prozedur hinzufügen, um das Ergebnis der Funktion festzulegen.

Fügen Sie der URL den Funktionsnamen hinzu, um diese Funktion zu implementieren. In der URL für gebundene Aktivitäten besteht ein kleiner Unterschied zwischen API und OData v4. Mit OData würden Sie NAV. als Präfix verwenden. Mit API würden Sie Microsoft.NAV. als Präfix verwenden.

Die URL für OData v4 sieht dann wie folgt aus:

POST /ODataV4/Company(<companyName>)/Customers(<code>)/NAV.<functionName>

Die URL für API sieht dann wie folgt aus:

POST /api/v2.0/Company(<companyid>)/customers(<id>)/Microsoft.NAV.<functionName>

Im folgenden Beispiel möchten Sie eine Vorlage auf einen Debitor anwenden, wenn der Debitor mithilfe der API erstellt wird. Die Vorlagen hängen von der Region ab, die als Parameter bereitgestellt wird. In einer Codeunit ist eine gewisse Logik vorhanden, die die richtige Vorlage abruft und diese Vorlage auf den Debitorendatensatz anwendet.

[ServiceEnabled]
procedure ApplyTemplate(var actionCnxt: WebServiceActionContext; region: Text[20])
var
    CustomLogicMngt: Codeunit "Custom Logic Management";
begin
    if region = '' then
        Error('You must provide a valid region code for this function.');

    CustomLogicMngt.ApplyCustomerTemplate(Rec, region);
    actionCnxt.SetObjectType(ObjectType::Page);
    actionCnxt.SetObjectId(Page::"My Custom Customer API");
    actionCnxt.AddEntityKey(Rec.FieldNo(SystemId), Rec.SystemId);

    actionCnxt.SetResultCode(WebServiceActionResultCode::Updated);
end;

Im Enumerator WebServiceActionResultCode können Sie angeben, ob ein Datensatz erstellt oder aktualisiert oder die Funktion erfolgreich abgeschlossen werden und einen HTTP-Statuscode von „200“ zurückgeben soll.

Ungebundene Aktionen

Die OData-Webdienste unterstützen ebenfalls Ungebundene Aktionen. Diese ungebundenen Aktionen werden innerhalb von Codeunits erstellt und sind nicht mit einer bestimmten Entität verknüpft (daher ungebunden). Ungebundene Aktionen sind nicht für die API-Dienste verfügbar, nur für OData-Webdienste. Eine Prozedur in einer Codeunit, die als ungebundene Aktion veröffentlicht wird, benötigt kein ServiceEnabled-Attribut. Sie müssen nur eine öffentliches Verfahren erstellen und die Codeunit als Webdienst veröffentlichen.

Die URL für die ungebundene OData v4-Aktion wäre folgende:

POST /ODataV4/{serviceName}_{procedureName}?company={companyName}

codeunit 50100 "MiscOperations"
{
    procedure Ping(input: Integer): Integer
    begin
        exit(-input);
    end;
 
    procedure Delay(delayMilliseconds: Integer)
    begin
        Sleep(delayMilliseconds);
    end;
 
    procedure GetLengthOfStringWithConfirmation(inputJson: Text): Integer
    var
        c: JsonToken;
        input: JsonObject;
    begin
        input.ReadFrom(inputJson);
        if input.Get('confirm', c) and c.AsValue().AsBoolean() = true and input.Get('str', c) then
            exit(StrLen(c.AsValue().AsText()))
        else
            exit(-1);
    end;
}

Wenn Sie die Codeunit mit einem Dienstnamen MiscOperations veröffentlichen, sind die Verfahren unter folgenden URLs verfügbar:

POST /ODataV4/MiscOperations_Ping?company=CRONUS%20USA%20Inc.

POST /ODataV4/MiscOperations_Delay?company=CRONUS%20USA%20Inc.

POST /ODataV4/MiscOperations_GetLengthOfStringWithConfirmation?company=CRONUS%20USA%20Inc.