Acciones vinculadas de la API y OData

Completado

Ya ha aprendido a leer datos existentes y a crear o actualizar datos. También tiene la posibilidad de ejecutar un procedimiento a través de OData. Dado que la API se basa en OData, puede usar la misma funcionalidad en los servicios web de API y OData v4.

Sin embargo, no puede ejecutar ningún procedimiento en una página de la API. Puede agregar un atributo [ServiceEnabled] al procedimiento con WebServiceActionContext y WebServiceActionResultCode del procedimiento para establecer el resultado de la función.

Para implementar dicha función, agregue el nombre de la función a la URL. Existe una pequeña diferencia entre API y OData v4 en la URL para acciones vinculadas. Con OData, usaría NAV. como prefijo. Con la API, usaría Microsoft.NAV. como prefijo.

La URL de OData v4 sería la siguiente:

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

La URL de la API sería la siguiente:

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

En el siguiente ejemplo quiere aplicar una plantilla a un cliente cuando el cliente se crea con la API. Las plantillas dependen de la región que se proporciona como parámetro. Existe cierta lógica en una codeunit que recuperará la plantilla correcta y aplicará dicha plantilla en el registro del cliente.

[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;

El enumerador WebServiceActionResultCode es donde puede especificar si se crea o actualiza un registro o si la función se completó correctamente y debe devolver un código de estado HTTP de 200.

Acciones sin enlazar

Los servicios web OData también admiten Acciones sin enlazar. Estas acciones sin enlazar se crean en Codeunits y no están vinculadas a una entidad específica (por lo tanto, sin enlazar). Las acciones sin enlazar no están disponibles para los servicios de la API, solo para los servicios web OData. Un procedimiento en una codeunit publicada como una acción sin enlazar no necesita un atributo ServiceEnabled. Solo necesita crear un procedimiento público y publicar la codeunit como un servicio web.

La URL para la acción sin enlazar de OData v4 sería la siguiente:

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;
}

Si publica la codeunit con un nombre de servicio MiscOperations, entonces los procedimientos están disponibles con las siguientes URL:

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

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

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