ObjMgrLog  Info  ::  ARTICLES

Calling REST APIs from Siebel: why EAI HTTP Transport falls short, and what to do instead

Sooner or later, every Siebel environment has to talk to something modern: a REST API for address validation, a payments gateway, a document service, an internal microservice that replaced an old mainframe feed. And that’s where a lot of Siebel developers discover the same thing: making Siebel call a modern REST/JSON API is harder than it has any right to be.

The tool Siebel gives you, EAI HTTP Transport, was designed in and for a different era. It works, but it fights you the moment you step outside the SOAP-and-XML world it was built for. Here’s where it falls short, and a cleaner way to make the call.

The problem: EAI HTTP Transport shows its age

EAI HTTP Transport predates the REST/JSON style that every external API now speaks. You can bend it to call a REST endpoint, but the friction adds up:

Configuration over code. A single API call means named subsystems, transport parameters, and profile configuration - administrative plumbing spread across the server rather than a call you can read in one place. For a developer who just needs to POST some JSON and read the response, that’s a lot of ceremony.

Awkward header and verb handling. Setting arbitrary request headers - a bearer token, a custom X- header an API requires, a correlation ID - is fiddly, and the less-common verbs (PATCH especially) are painful. Modern APIs assume you can set any header and use any method freely; the old transport makes both harder than they should be.

Character encoding surprises. Send a body containing an accented name, a non-Latin script, or an emoji, and you can get mojibake on the far end if the charset isn’t nailed down explicitly. Diagnosing “it works for English but breaks for everything else” after the fact is a miserable afternoon.

Opaque failures. When a call fails, you often get a low-level error that tells you little about why - was it a bad host, a timeout, a refused connection, or a real HTTP error status from the server? Those need completely different fixes, and untangling them from the transport’s error output is guesswork.

The eScript temptation, and its own trap

The usual reaction is to skip the transport and write the HTTP call by hand in Business Service eScript, or a Java Business Service, using whatever HTTP library is on the classpath. That’s the right instinct - a plain HTTP call is exactly what you want - but rolling it yourself invites a fresh set of problems:

None of this is hard in isolation. But getting all of it right - and keeping it right across a Siebel upgrade - is real engineering time, and it’s the kind of code that fails in production at the worst moment if a detail was missed.

What a clean solution looks like

The goal is simple: call a REST API from Siebel the way you’d call any service - pass a URL, some headers, and a body; get back a status code and a response - without the transport’s configuration overhead and without hand-rolling the hard parts. Concretely, a good HTTP client for Siebel should:

That’s exactly the gap we built the SRS HTTP Client to fill. It’s a Siebel Business Service that turns a REST call into one method invocation - URL, hdr_* headers, a body, an optional timeout in, and status code plus response body out - with UTF-8 enforced on JSON bodies, honest transport-vs-HTTP error reporting, and a SIF you import straight into Siebel Tools. It ships as two jars, one for Java 8 / HttpClient 4.x Siebel and one for Java 21 / HttpClient 5.x, so it fits whichever release you run today and the one you upgrade to tomorrow.

The takeaway

EAI HTTP Transport isn’t broken - it’s just from a different era, and it shows every time you point it at a modern REST/JSON API. Hand-rolling the call replaces configuration pain with a set of easy-to-get-wrong details that bite in production. If you make more than the occasional outbound REST call from Siebel, it’s worth having a clean, tested HTTP client that gets the encoding, timeouts, error handling, and HttpClient-version question right once - so you can go back to building the integration instead of debugging the plumbing.