How to view actual outgoing HTTP Request Headers from REST Connector PostCall?
-
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
ModeratorHas 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::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
-
This reply was modified 3 weeks, 3 days ago by
Armin Winkler.
-
This reply was modified 3 weeks, 3 days ago by
Armin Winkler.
3 weeks ago #66687::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
ModeratorHas 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::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
-
This reply was modified 3 weeks, 3 days ago by
You must be logged in to reply to this topic.