How to view actual outgoing HTTP Request Headers from REST Connector PostCall?

  • Deniz
    Participant
      3 weeks, 6 days ago #66282

      Hi Simplifier Community,

      I’m trying to debug a REST PostCall to an external OData API (IFS Cloud) and suspect an issue with the outgoing HTTP headers, specifically the Content-Type. My connector call is configured with Format: JSON, and in my script, I’m attempting to set Content-Type: “application/json;IEEE754Compatible=true” via the Headers object parameter.

      Despite the payload body seeming correct, I’m getting a persistent API error from the target system (400 – Invalid value for property ‘BuyUnitPrice’).

      I need to verify the exact headers Simplifier is sending. I saw an older forum comment mentioning: “if you active the trace on the http-client you can see the request headers in the Backend log.”

      Could someone explain how to enable this kind of trace for the REST connector’s HTTP client, or suggest another way to inspect the final outgoing request headers from Simplifier?

      Thanks for any pointers!

      Armin Winkler
      Moderator
        Has successfully completed the online course Introduction
        Has successfully completed the online course Intermediate (200)
        Has successfully completed the online course Advanced (300)
        Has successfully completed the online course Basics (100)
      3 weeks, 3 days ago #66639
      Up
      1
      Down
      ::

      Hi Deniz,

       

      you should be able to see the full REST request details in Simplifier’s ‘Monitoring’ function inside of the tab named ‘Logs‘. When you execute a REST connector call, this should create a new log entry which gets written on log level ‘INFO’. In the table row, please click on the ‘i’ icon under the ‘Details’ column to make the details appear inside of a popover. In case you can’t see the entry row at all, please verify first whether your system has log entries activated on that particular level as configured in the Log settings.

       

      Manually setting the content type for a REST connector call via header parameter should be possible if you are using a current server release (available since release 8 EHP 1), however I think the OData definition requires you to submit the ‘IEEE754Compatible’ flag via the ‘$format’ query parameter instead. Please have a look at their documentation, which is where I also got my information from.

       

      Please let us know if this helps you to finish setting up your OData request via Simplifier’s REST connector.

       

      Kind regards,

      Armin

      Deniz
      Participant
        3 weeks ago #66687
        Up
        0
        Down
        ::

        Hi Armin, thank you for your reply.

        I followed your advice and went to Monitoring -> Logs, found the relevant level log entry for my failed REST PostCall, and clicked the ‘i’ icon to see the details. I’ve included the log output from that detail view below for reference.

        From what I can tell this log entry shows input parameters like path, postBody, Authorization.
        It also shows Headers and Body of the response Simplifier received back from the API.

        But it seems that I’m still unable to see the actual outgoing http request header, that Simplifier sends to the API.
        Is there a specific configuration, or another method within Simplifier that would allow me to see the complete raw HTTP request, including all headers, as it leaves Simplifier and goes to the external API?

        Kind regards and thank you for the help,

        Deniz

        {
        “error” : “The Http request was not successful due to the client error: [400: Bad Request – The request contains bad syntax or cannot be fulfilled.] Response: {\”error\”:{\”code\”:\”REQUEST_ERROR\”,\”message\”:\”Malformed Request.\”,\”details\”:[{\”code\”:\”INVALID_VALUE_FOR_PROPERTY\”,\”message\”:\”Invalid value for property ‘BuyUnitPrice’.\”}]}}”,
        “parameters” : {
        “etag” : {
        “dataType” : “String”,
        “empty” : true
        },
        “path” : {
        “dataType” : “String”,
        “value” : “PurchaseRequisitionHandling.svc/Purch…”
        },
        “postFormat” : {
        “dataType” : “String”,
        “const” : “JSON”
        },
        “verb” : {
        “dataType” : “String”,
        “const” : “POST”
        },
        “postBody” : {
        “dataType” : “Any”,
        “value” : {
        “PartNo” : “partNo”,
        “FbuyUnitPrice” : “68”,
        “CCostCenterCode” : “B”,
        “BuyerCode” : “*”,
        “TaxAmountCurrency” : “0.06”,
        // weitere Felder
        }
        },
        “Authorization” : {
        “dataType” : “String”,
        “value” : “Bearer eyJhbYWlsXqedDkTZg”
        },
        “Prefer” : {
        “dataType” : “String”,
        “empty” : true
        }
        },
        “customDetails” : {
        “Protocol” : “HTTP/1.1”,
        “Status-Code” : 400,
        “Headers” : {
        “Server” : “ifs-sticky-ingress”,
        “x-xss-protection” : “1; mode=block”,
        “Strict-Transport-Security” : “max-age=31536000; includeSubDomains”,
        “X-Frame-Options” : “SAMEORIGIN”,
        “content-security-policy” : “default-src ‘self'”,
        “Connection” : “keep-alive”,
        “x-ifs-request-id” : “74384a60-48c9-451b-bf0c-523d6928bb6b”,
        “content-language” : “en-US”,
        “referrer-policy” : “same-origin”,
        “odata-version” : “4.0”,
        “X-Content-Type-Options” : “nosniff”,
        “Date” : “Mon, 02 Jun 2025 07:02:37 GMT”,
        “Set-Cookie” : “ifs-sticky=17a59e; Expires=Wed, 04 Jun 2025 07:02:37 GMT; Max-Age=172800; Path=/; Secure; HttpOnly”,
        “vary” : “Accept-Encoding”
        },
        “Content-Type” : “application/json”,
        “Entity” : “170 Byte”,
        “Body” : “HttpEntity.Strict(text/plain; charset=UTF-8,170 bytes total)”
        },
        “stacktrace” : “com.itizzimo.appServer.connector.ConnectorType$ConnectorExecutionException: The Http request was not successful due to the client error: [400: Bad Request – The request contains bad syntax or cannot be fulfilled.] Response: {\”error\”:{\”code\”:\”REQUEST_ERROR\”,\”message\”:\”Malformed Request.\”,\”details\”:[{\”code\”:\”INVALID_VALUE_FOR_PROPERTY\”,\”message\”:\”Invalid value for property ‘BuyUnitPrice’.\”}]}}
        at com.itizzimo.appServer.connector.types.rest.operations.stepsExecute.RESTStepExecuteRequest.com$itizzimo$appServer$connector$types$rest$operations$stepsExecute$RESTStepExecuteRequest$$toFailure(RESTStepExecuteRequest.scala:110)
        at com.itizzimo.appServer.connector.types.rest.operations.stepsExecute.RESTStepExecuteRequest$$anonfun$handleHttpErrors$1.applyOrElse(RESTStepExecuteRequest.scala:92)
        at com.itizzimo.appServer.connector.types.rest.operations.stepsExecute.RESTStepExecuteRequest$$anonfun$handleHttpErrors$1.applyOrElse(RESTStepExecuteRequest.scala:90)
        at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:38)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.applyExecRecovery(ConnectorExecutionContext.scala:214)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:143)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalIntermediate(ConnectorExecutionContext.scala:163)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:140)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalIntermediate(ConnectorExecutionContext.scala:163)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:140)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalRecoveryIntermediate(ConnectorExecutionContext.scala:167)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:145)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalIntermediate(ConnectorExecutionContext.scala:163)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:140)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalIntermediate(ConnectorExecutionContext.scala:163)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:140)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalIntermediate(ConnectorExecutionContext.scala:163)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:140)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalRecoveryIntermediate(ConnectorExecutionContext.scala:167)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:145)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evalIntermediate(ConnectorExecutionContext.scala:163)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecutionImpl(ConnectorExecutionContext.scala:140)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecution(ConnectorExecutionContext.scala:109)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionContext.evaluateExecution$(ConnectorExecutionContext.scala:105)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionRunner.evaluateExecution(ConnectorExecutionRunner.scala:23)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionRunner$$anonfun$receive$1.applyOrElse(ConnectorExecutionRunner.scala:38)
        at akka.actor.Actor.aroundReceive(Actor.scala:537)
        at akka.actor.Actor.aroundReceive$(Actor.scala:535)
        at com.itizzimo.appServer.connector.execution.ConnectorExecutionRunner.aroundReceive(ConnectorExecutionRunner.scala:23)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579)
        at akka.actor.ActorCell.invoke(ActorCell.scala:547)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270)
        at akka.dispatch.Mailbox.run(Mailbox.scala:231)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1623)
        Caused by: com.itizzimo.appServer.helper.http.package$HttpRequestClientError: The Http request was not successful due to the client error: [400: Bad Request – The request contains bad syntax or cannot be fulfilled.] Response: {\”error\”:{\”code\”:\”REQUEST_ERROR\”,\”message\”:\”Malformed Request.\”,\”details\”:[{\”code\”:\”INVALID_VALUE_FOR_PROPERTY\”,\”message\”:\”Invalid value for property ‘BuyUnitPrice’.\”}]}}
        at com.itizzimo.appServer.helper.http.definitions.logging.Exceptions$RequestExecution$.DefaultHttpRequestClientError(Exceptions.scala:122)
        at com.itizzimo.appServer.helper.http.client.HttpClient.transformResponse(HttpClient.scala:241)
        at com.itizzimo.appServer.helper.http.client.HttpClient.$anonfun$generalRequestWorkflow$4(HttpClient.scala:224)
        at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:307)
        at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:51)
        at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:74)
        at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:64)
        at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:101)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:85)
        at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:101)
        at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:49)
        … 3 more
        “,
        “executionMetrics” : {
        “begin” : “2025-06-02T09:02:12.27288429+02:00”,
        “end” : “2025-06-02T09:02:12.375853709+02:00”,
        “duration” : “102,969 ms”,
        “durationNano” : 102969419,
        “steps” : [ {
        “name” : “REST Request Execution Operation”,
        “begin” : “2025-06-02T09:02:12.27295075+02:00”,
        “end” : “2025-06-02T09:02:12.37584191+02:00”,
        “duration” : “102,891 ms”,
        “durationNano” : 102891160,
        “finishedSuccessfully” : false,
        “subSteps” : [ {
        “name” : “Prepare URI”,
        “begin” : “2025-06-02T09:02:12.273038697+02:00”,
        “end” : “2025-06-02T09:02:12.273103601+02:00”,
        “duration” : “64,904 μs”,
        “durationNano” : 64904,
        “finishedSuccessfully” : true
        }, {
        “name” : “Prepare Http-Settings”,
        “begin” : “2025-06-02T09:02:12.273121361+02:00”,
        “end” : “2025-06-02T09:02:12.27316615+02:00”,
        “duration” : “44,789 μs”,
        “durationNano” : 44789,
        “finishedSuccessfully” : true
        }, {
        “name” : “Prepare Payload”,
        “begin” : “2025-06-02T09:02:12.273174361+02:00”,
        “end” : “2025-06-02T09:02:12.273221377+02:00”,
        “duration” : “47,016 μs”,
        “durationNano” : 47016,
        “finishedSuccessfully” : true
        }, {
        “name” : “Augment Http Request with Authorization”,
        “begin” : “2025-06-02T09:02:12.273229324+02:00”,
        “end” : “2025-06-02T09:02:12.273248521+02:00”,
        “duration” : “19,197 μs”,
        “durationNano” : 19197,
        “finishedSuccessfully” : true
        }, {
        “name” : “Execute Http Request”,
        “begin” : “2025-06-02T09:02:12.273272115+02:00”,
        “end” : “2025-06-02T09:02:12.375827969+02:00”,
        “duration” : “102,556 ms”,
        “durationNano” : 102555854,
        “finishedSuccessfully” : false
        } ]
        } ]
        },
        “additionalExecutionProperties” : {
        “httpErrorEntity” : “170 Byte”,
        “httpErrorResponse” : {
        “Protocol” : “HTTP/1.1”,
        “Status-Code” : 400,
        “Headers” : {
        “Server” : “ifs-sticky-ingress”,
        “x-xss-protection” : “1; mode=block”,
        “Strict-Transport-Security” : “max-age=31536000; includeSubDomains”,
        “X-Frame-Options” : “SAMEORIGIN”,
        “content-security-policy” : “default-src ‘self'”,
        “Connection” : “keep-alive”,
        “x-ifs-request-id” : “74384a60-48c9-451b-bf0c-523d6928bb6b”,
        “content-language” : “en-US”,
        “referrer-policy” : “same-origin”,
        “odata-version” : “4.0”,
        “X-Content-Type-Options” : “nosniff”,
        “Date” : “Mon, 02 Jun 2025 07:02:37 GMT”,
        “Set-Cookie” : “ifs-sticky=1749e; Expires=Wed, 04 Jun 2025 07:02:37 GMT; Max-Age=172800; Path=/; Secure; HttpOnly”,
        “vary” : “Accept-Encoding”
        },
        “Content-Type” : “application/json”,
        “Entity” : “170 Byte”
        },
        “names” : {
        “connector” : “IFS_Cloud_Rest”,
        “connectorCall” : “PostCall”
        },
        “uri” : “https://ict.kunertgroup.com/main/ifsapplications/projection/v1/PurchaseRequisitionHandling.svc/PurchaseRe…”,
        “httpErrorStatusCodeDefinition” : {
        “intValue” : 400,
        “reason” : “Bad Request”,
        “defaultMessage” : “The request contains bad syntax or cannot be fulfilled.”,
        “type” : {
        “isSuccess” : false,
        “isFailure” : true,
        “isRedirection” : false,
        “allowsEntity” : true
        }
        },
        “httpErrorContentTypeDefinition” : {
        “mediaType” : {
        “main” : “application”,
        “sub” : “json”,
        “class” : “Fixed Charset”,
        “compressibility” : “Compressible”,
        “information” : {
        “isWildcard” : false,
        “isMultipart” : false,
        “isCompressible” : true,
        “isBinary” : false,
        “isMessage” : false,
        “isApplication” : true,
        “isVideo” : false,
        “isAudio” : false,
        “isText” : false,
        “isImage” : false
        },
        “fileExtensions” : [ “json” ],
        “qValue” : 1.0
        },
        “charset” : {
        “value” : “UTF-8”,
        “aliases” : [ “UTF8” ],
        “qValue” : 1.0
        }
        },
        “httpErrorStatusCode” : 400,
        “httpErrorContentType” : “application/json”,
        “httpErrorEntityDefinition” : “170 Byte”,
        “httpErrorMessage” : “The Http request was not successful due to the client error: [400: Bad Request – The request contains bad syntax or cannot be fulfilled.] Response: {\”error\”:{\”code\”:\”REQUEST_ERROR\”,\”message\”:\”Malformed Request.\”,\”details\”:[{\”code\”:\”INVALID_VALUE_FOR_PROPERTY\”,\”message\”:\”Invalid value for property ‘BuyUnitPrice’.\”}]}}”,
        “withApiKey” : false
        }
        }

        • This reply was modified 3 weeks ago by Deniz.
        Armin Winkler
        Moderator
          Has successfully completed the online course Introduction
          Has successfully completed the online course Intermediate (200)
          Has successfully completed the online course Advanced (300)
          Has successfully completed the online course Basics (100)
        3 days, 9 hours ago #67092
        Up
        0
        Down
        ::

        Hi Deniz,

        thank you for creating a ticket in our support portal for this matter. This way, we were able to provide you with more detailed help which enabled you to solve your OData-related payload issue for good.

        Kind regards,

        Armin

      Viewing 4 posts - 1 through 4 (of 4 total)

      You must be logged in to reply to this topic.