Acciones vinculadas de la API y OData
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.