App Connect

App Connect

Join this online user group to communicate across IBM product users and experts by sharing advice and best practices with peers and staying up to date regarding product enhancements.

 View Only

The Case of the Missing Query Parameters.

By Matthias Blomme posted 10 days ago

  

Aka

“The Blog That Reads like an Agatha Christie Story” 

or

“The Overly Dramatic Description of a Simple Problem“.

The Setup: A Flow, a Request, and a Vanishing Act

It started with a perfectly normal request, as these things often do.

A simple REST API flow. Nothing fancy, just a simple endpoint that should take in a few query parameters and trigger some downstream logic.

 

The request was clean. The endpoint responded. No errors. No warnings.

But there was one problem: the query parameters never entered the flow. The data was gone. It wasn’t dropped or malformed, it was just... not there. And that’s where our story begins.

 

However, everything looked right. The nodes were in place, the method was correct, and the parameters were being sent. But the flow acted like the second parameter never existed in the first place.

And so,  the investigation began.

The First Suspects: Nodes and Misconfigurations

We start with the usual culprits, the butlers of the story:

  • Parse query string setting: are we actually parsing the query parameters?
  • Compute mode: are we passing them on down-stream?

Parse query string

The most obvious of suspects can be verified simply by looking at the HTTP Input node. Open the message flow with the message flow editor

 

And take a look at the Parse Query String option in the Advanced options group. This one was checked.

 

Compute mode

Second suspect: the Compute mode of the Compute Node. If an upstream Compute Node is set to a Compute mode that includes the LocalEnvironment, make sure the InputLocalEnvironment is actually being copied over to the OutputLocalEnvironment.

No issue here, these settings are ok.

Conclusion

All checked. All innocent.

Side note: the Parse Query String option is enabled by default for REST API integrations. If you would use a normal ACE message flow with an HTTP Input node, this isn’t the case and needs to be explicitly enabled.

 

 

Further investigation: using the little grey cells

Looking further at the flow, the LocalEnvironment gives us a clue. You can check the LocalEnvironment via a number of ways.

1. You can debug the flow

 

2. You can use the flow exercises

 

3. You can use the Log Node

 

 

Or any other way that prints the LocalEnvironment (such as a trace node).

Now, looking at that last screenshot, you can notice that the REST LocalEnvironment (REST.Input.Parameters) only contains 1 parameter

"REST":{"Input":{"Method":"GET","Operation":"getSearch","Path":"/mystery/v1/search","URI":"http://localhost:7800/mystery/v1/search","Parameters":{"searchQuery":"Random"}}

But if you have another look, you can also see an HTTP LocalEnvironment (HTTP.Input.QueryString), that does contain both query parameters.

HTTP":{"RequestIdentifier":"4556485400000000000000007954e6169c14180000000000"},"RouterList":{}},"HTTP":{"Input":{"Path":{"Segment":["mystery","v1","search"]},"QueryString":{"searchQuery":"Random","index":"1"}}

Interlude: HTTP Input vs REST API, Know Your Players

Before we get to the real twist in this story, let’s step back and talk about the two leads in our little drama: the HTTP Input node and the REST API flow.

They both accept HTTP requests. They both kick off message flows. But beyond that, they’re playing two very different games.

REST API: The Rule-Follower

The REST API flow is the obsessive one. It reads the OpenAPI YAML like it’s gospel, and then enforces it with the discipline of a Swiss watchmaker.

  • If a method isn’t allowed in the spec, it’s rejected.
  • If a query parameter isn’t defined, it’s ignored.
  • Everything that is defined shows up neatly in the LocalEnvironment REST.Input.Parameters part.

In other words, you get structure, validation, and strict behavior. It does a lot for you, as long as you define everything correctly.

HTTP Input: The Wild Card

The HTTP Input node doesn’t care what your YAML says, because it doesn’t even know it exists.

  • It accepts whatever hits the endpoint.
  • You want method checking? Do it yourself.
  • Query string parsing? Better enable it.
  • Parameter validation? That’s on you.

You’re in full control, but also responsible for every piece of logic you want. It’s a blank slate, and that’s both its power and its pain.

Why This Matters

If you’re debugging a flow and forget which type you’re using, things get weird fast.

You expect certain params to show up, but they don’t. You assume behavior that only the REST API flow gives you, but you’re using a raw HTTP input instead.

And suddenly, you’re deep in the weeds chasing ghosts.

Exhibit A: REST vs HTTP in Action

Let’s not speculate, let’s test.

To really understand how ACE handles HTTP traffic under the hood, I set up two flows:

  • One is using a REST API defined via OpenAPI YAML.
  • One is using a plain old HTTP Input node.

The goal? To see exactly how each flow handles:

  • Query parameters (defined vs undefined)
  • HTTP methods (allowed vs blocked)
  • LocalEnvironment structure
  • Error handling

This isn’t theory, it’s fieldwork. And as we’re about to see, the differences aren’t so subtle.

REST API

Setup



Outcome

 

As you can see from the screenshots above:

  • Undefined methods are blocked, based on the yaml specification.
  • Undefined query parameters are not passed on to the REST LocalEnvironment

HTTPInput

Setup



Outcome

 

 

As you can see from the screenshots above:

  • Unless you explicitly block them, undefined methods go through without a hitch.
  • All query parameters are passed on to the HTTP LocalEnvironment

The Verdict

Based on the examples, we can draw the following conclusions

·         REST enforces the contract. If the method or parameter isn’t in the spec, it’s blocked or ignored.

·         HTTP Input is open-ended—it gives you everything, but it’s up to you to make sense of it.

·         Debugging behaviour can differ depending on which one you use; you have to make sure to search in the correct place.

The lesson? Know your tool. REST gives you structure, HTTP gives you freedom, but both demand attention when something goes missing.

The Overlooked Clue: The OpenAPI Spec

The real issue? One of the query params was never defined in the OpenAPI YAML.
If they’re not in the spec, they don’t exist, at least not to REST API flow.

Here's the actual difference in LocalEnvironment output between REST and HTTP

// REST.Input.Parameters
{
  "searchQuery": "Random"
}
 

// HTTP.Input.QueryString
{
  "searchQuery": "Random",
  "index": "1"
}

Matches the API definition

 

The Smoking Gun: One Line That Fixes It All

A simple addition to the OpenAPI file that would’ve made it all work, adding the second parameter.

# The missing line in OpenAPI
        - name: index
          in: query
          required: false
          schema:
            type: string

Giving the final OpenAPI definition

 

Running the call again, this time with the updated REST API.

 

And success! We solved the case.

The Takeaway: Specs Matter, Even for “Obvious” Stuff

No errors. No warnings. Just a silent ignore.
If your REST flow depends on a parameter, define it—or be ready to chase shadows. Not only when hosting a REST API, but also when consuming one.


For fewer mysteries and cleaner runs, keep your spec tight. Or just keep reading my blogs 😉


For more integration tips and tricks, visit Integration Designers and check out our other blog posts.


Resources:

Written by Matthias Blomme

#IBMChampion

#AppConnectEnterprise(ACE)

0 comments
7 views

Permalink