Skip to main content
vineethk0001
Known Participant
Jun 25, 2021 6:44 AM UTC
Question

Expose and API from Appian

Hi All,

  Can anyone help me on, is it possible we can expose an API from Appian Side, which can be accessed by SAP ,

and when the Api is called from SAP side, a Process model will trigger with details.

    11 replies

    acaciob0002
    Participating Frequently
    Jun 25, 2021 6:54 AM UTC

    Hi Vinneth,

    I ended up answering you in your other thread. 

    But yes, you can achieve what you are looking for using an Web API component. 

    Please check the link below:

    https://docs.appian.com/suite/help/21.2/Designing_Web_APIs.html

    Regards,

    Acacio B,

    stefanhelzle0001
    Brainy
    Jun 25, 2021 7:26 AM UTC

    In Appian, when you create a new web api object, this is one of the available templates. Takes about 5 clicks. Did you try this?

    vineethk0001
    Known Participant
    Jun 28, 2021 6:15 PM UTC

    Hi Stefan/Acacio,

      I have implemented the Mapping to CDT with API Body, but getting the below error, can you please help me out with the same,

      Not a valid Web API Response. Received: [Lcom.appiancorp.core.expr.reaction.ReactionTree;@2617a999.

    Internal Server Error on REST API invocation.
    com.appiancorp.exceptions.LocalizedAppianRuntimeException$LocalizedAppianException: Contact your application administrator for help resolving this issue. Provide them with the following issue identifier: IV82KT3W (APNX-1-4533-000)

    
    a!localVariables(
      local!jsondata : a!fromJson(
        http!request.body
      ),
      local!cdtdata : a!forEach(items: local!jsondata, expression:{'type!{urn:com:appian:types}PF_Request'(
        requestId: fv!item[fv!index].requestId, 
        destinationCountryID: fv!item[fv!index].destinationCountryID,
        frieghtCurrencyID: fv!item[fv!index].frieghtCurrencyID,
        GBEID: fv!item[fv!index].GBEID,
        LID: fv!item[fv!index].LID,
        LOBID: fv!item[fv!index].LOBID,
        leadSupplyLocationID: fv!item[fv!index].leadSupplyLocationID,
        originCountryID: fv!item[fv!index].originCountryID,
        processID: fv!item[fv!index].processID,
        reasonCodeID: fv!item[fv!index].reasonCodeID,
        regionID: fv!item[fv!index].regionID, 
        rootCauseID: fv!item[fv!index].rootCauseID,
        routingMethodID: fv!item[fv!index].routingMethodID,
        shipmentDirectionID: fv!item[fv!index].shipmentDirectionID,
        shipmentWidth: fv!item[fv!index].shipmentWidth,
        shipperID: fv!item[fv!index].shipperID,
        approvalLevels: fv!item[fv!index].approvalLevels,
        approvalLevelsCompleted: fv!item[fv!index].approvalLevelsCompleted,
        correctiveActionReason: fv!item[fv!index].correctiveActionReason,
        destionationCustomerSupplier: fv!item[fv!index].destionationCustomerSupplier,
        destinationSiteID: fv!item[fv!index].destinationSiteID, 
        fGPartNumber: fv!item[fv!index].fGPartNumber,
        freightCost: fv!item[fv!index].freightCost,
        isFreightRecoverable: fv!item[fv!index].isFreightRecoverable,
        isWeightKnown: fv!item[fv!index].isWeightKnown,
        originCustomerSupplier: fv!item[fv!index].originCustomerSupplier,
        originSiteID: fv!item[fv!index].originSiteID,
        originStateId: fv!item[fv!index].originStateId,
        otherRoutingMethod: fv!item[fv!index].otherRoutingMethod,
        otherShipper: fv!item[fv!index].otherShipper,  
        partNumber: fv!item[fv!index].partNumber, 
        projectNumber: fv!item[fv!index].projectNumber,
        purchaseOrder: fv!item[fv!index].purchaseOrder,
        requestDt: fv!item[fv!index].requestDt,
        requestor: fv!item[fv!index].requestor,
        requiredShipDate: fv!item[fv!index].requiredShipDate,
        revenueAtRisk: fv!item[fv!index].revenueAtRisk,
        rootCauseReason: fv!item[fv!index].rootCauseReason,
        ShipmentHeight: fv!item[fv!index].ShipmentHeight,
        ShipmentLength: fv!item[fv!index].ShipmentLength,
        ShipmentUnits: fv!item[fv!index].ShipmentUnits, 
        ShipmentWeight: fv!item[fv!index].ShipmentWeight,
        ShipperEmail: fv!item[fv!index].ShipperEmail,
        Status: fv!item[fv!index].Status,
        TotalCost: fv!item[fv!index].TotalCost,
        USFreightCost: fv!item[fv!index].USFreightCost,
        WaybillNumber: fv!item[fv!index].WaybillNumber,
        OriginSite: fv!item[fv!index].OriginSite,
        DestinationSite: fv!item[fv!index].DestinationSite,
        /*CompletedOn: fv!item[fv!index].CompletedOn,*/
        ActualFreightCost: fv!item[fv!index].ActualFreightCost,
        FreightRiskPercent: fv!item[fv!index].FreightRiskPercent,
        
      )
      
      }
      ),
      
      {
        
        a!startProcess(
          processModel: cons!Test_Email_WebAPI,
          processParameters: {
            PF_Request : local!cdtdata
          },
          onSuccess: a!httpResponse(
            statusCode: 200,
            headers: {
              a!httpHeader(name: "Content-Type", value: "application/json")
            },
            body: a!toJson(
              fv!processInfo
            )
          ),
          onError: a!httpResponse(
            statusCode: 500,
            headers: {
              a!httpHeader(name: "Content-Type", value: "application/json")
            },
            body: a!toJson(
              {
                error: "There was an error starting the process"
              }
            )
          )
        )
      }
      
    )
    

    stefanhelzle0001
    Brainy
    Jun 29, 2021 5:23 AM UTC

    There is a few things here. First, about the error message. Check this

    https://docs.appian.com/suite/help/21.2/Appian_Administration_Console.html#simplified-error-messages

    Then, the foreach(). fv!item already is a single item from the list. There is no need for [fv!index|.

    Next, is the data structure in JSON any different than the CDT? Why recreate the data at all? Appian would happily map the data into your process.