Custom services - API request and response using X++

Creating custom services:



Requirement: D365 FO Received request from external application, read the request within D365 FO and response back to external application from D365 FO.

Request body:

{

  "_request": {

    "SalesId": ["TestSO001", "TestSO002"]

  }

}


Response body:

{

  "OrderDetails": [

    {

      "order_number": "TestSO001",

      "ShipmentTrack": ["Track-01"]

       },

    {

      "order_number": "TestSO001",

      "ShipmentTrack": ["Track-02", "Track-03"]

      }

  ]

}


To achieve above request and response JSON, we need to create few contract classes and to communicate external application, we need to create service and service group objects.  AppId and secrets key needs to setup under D365 FO AAD.

Request Contract class:

[datacontractattribute]

public class XYZ_ShipmentRequest

{

   

   DataAreaId    dataAreaId;

    List          salesOrderList;

 

    [DataMemberAttribute('DataAreaId')]

    public SalesId ParmDataAreaId(str _dataAreaId = dataAreaId)

    {

        dataAreaId = _dataAreaId;

        return dataAreaId;

    }

 

    [DataMemberAttribute('SalesId')]

    public List parmSalesOrder(List _salesOrderList = salesOrderList)

 

    {

        salesOrderList = _salesOrderList;

 

        return salesOrderList;

    }

 

}


Response Contract:

[DataContractAttribute]

public class XYZ_ShipmentResponse

{

    List line;

    [DataMemberAttribute("OrderDetails"),AifCollectionTypeAttribute("OrderDetails",types::class, classstr(XYZ_ShipmentOrderResponse)),

    AifCollectionTypeAttribute("Return",types::class, classstr(XYZ_ShipmentOrderResponse))]

    public List parmLine(List _line = line)

    {

        line = _line;

        return line;

    }

 

}


public class XYZ_ShipmentOrderResponse

{

    SalesId   salesId;

    List      trackingNumber;

 

    [DataMemberAttribute("order_number")]

    public SalesId parmOrderNumber(SalesId _salesId = salesId)

    {

        salesId = _salesId;

 

        return salesId;

    }

 

    [DataMemberAttribute("ShipmentTrack")]

    public List parmTrackingNumber(List _trackingNumber = trackingNumber)

    {

        trackingNumber = _trackingNumber;

 

        return trackingNumber;

    }

}


Service class:

using Newtonsoft.Json;

public class XYZ_ShipmentService

{

    public Object create(XYZ_ShipmentRequest _request)

    {

        Object                          jsonString;

        XYZ_ShipmentResponse      salesOrderResponse;

        XYZ_ShipmentOrderResponse salesOrderLineResonse;

        SalesId                         salesId;

        List                            orderList = new List(Types::Class);

        List                            SalesOrderList    =  new List(Types::Class);

        Map                             map             = new Map (Types::IXYZger, Types::String);

        salesOrderList                        =  _request.ParmSalesOrder();

        ListEnumerator  ListLineEnumerator               =  salesOrderList.getEnumerator();

 

        while(ListLineEnumerator.moveNext())

        {

            changecompany(_request.ParmDataAreaId())

            {

                   salesId = ListLineEnumerator.current();

                   List trackingNumberList = new List(Types::String);

                   trackingNumberList.addEnd(this.getTrackingNumber(salesLine.RecId));  

                   salesOrderLineResonse = new XYZ_ShipmentOrderResponse();

      salesOrderLineResonse.parmOrderNumber(salesId);                       

      salesOrderLineResonse. parmTrackingNumber(trackingNumberList);    

                  orderList.addEnd(salesOrderLineResonse);

              }

            }

        }    

        salesOrderResponse = new XYZ_ShipmentResponse();

        salesOrderResponse.parmLine(orderList);

        jsonString = salesOrderResponse;

        return jsonString;

    }


Create Service and Service Group and pass service class and service class method on service object.

Construct service URL/API URL:

D365 base url/api/services/ServiceGroup_Name/Service_Name/Method_Name



Comments

Popular posts from this blog

Execute D365 F&O SSRS report with parameter and upload report output on Azure blob storage using X++

Microsoft D365 F&O: Remove custom models from deployable package

Generate Text/CSV/DAT file using X++ and upload on Azure blob storage