JSON String as a Query Parameter throws error
See original GitHub issue- Framework version: 1.1
- Implementations: Jersey
Scenario
I have a GET endpoint that takes in a String query parameter:
@GET
@Path("/search")
@Produces(MediaType.APPLICATION_JSON)
public Response list(@QueryParam("query") String queryStr) throws IOException {
Map<String, String> response = new HashMap<>();
response.put("body", queryStr);
return Response.status(200).entity(response).build();
}
}
When the endpoint is called with a simple string as a parameter it works as expected. For example .../search?query=helloWorld
would work as expected. However, when the function is called with a JSON string as a parameter I am seeing an IllegalArgumentException. Making this call .../search?query={"name":"faisal"}
would throw this error:
java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".
Expected behavior
The JSON string should be parsed as a string.
Actual behavior
The JSON string causes an IllegalArgumentException.
Steps to reproduce
- Define a GET endpoint that takes in a string as a query parameter
- Call endpoint with the parameter set to a JSON string.
Full log output
4310 [main] ERROR com.amazonaws.serverless.proxy.internal.LambdaContainerHandler - Error while handling request
java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".
at org.glassfish.jersey.uri.internal.UriTemplateParser.parseName(UriTemplateParser.java:331)
at org.glassfish.jersey.uri.internal.UriTemplateParser.parse(UriTemplateParser.java:256)
at org.glassfish.jersey.uri.internal.UriTemplateParser.<init>(UriTemplateParser.java:115)
at org.glassfish.jersey.uri.UriTemplate.createUriComponent(UriTemplate.java:1004)
at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:970)
at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:906)
at org.glassfish.jersey.uri.UriTemplate.createURI(UriTemplate.java:871)
at org.glassfish.jersey.uri.internal.JerseyUriBuilder._build(JerseyUriBuilder.java:914)
at org.glassfish.jersey.uri.internal.JerseyUriBuilder.build(JerseyUriBuilder.java:831)
at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.servletRequestToContainerRequest(JerseyHandlerFilter.java:141)
at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter(JerseyHandlerFilter.java:86)
at com.amazonaws.serverless.proxy.internal.servlet.FilterChainHolder.doFilter(FilterChainHolder.java:84)
at com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler.doFilter(AwsLambdaServletContainerHandler.java:207)
at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:171)
at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:75)
at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:168)
at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:200)
at com.lithium.tocoma.reach.handlers.AssetHandler.handleRequest(AssetHandler.java:23)
at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:283)
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
4316 [main] ERROR com.amazonaws.serverless.proxy.AwsProxyExceptionHandler - Called exception handler for:
java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".
at org.glassfish.jersey.uri.internal.UriTemplateParser.parseName(UriTemplateParser.java:331)
at org.glassfish.jersey.uri.internal.UriTemplateParser.parse(UriTemplateParser.java:256)
at org.glassfish.jersey.uri.internal.UriTemplateParser.<init>(UriTemplateParser.java:115)
at org.glassfish.jersey.uri.UriTemplate.createUriComponent(UriTemplate.java:1004)
at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:970)
at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:906)
at org.glassfish.jersey.uri.UriTemplate.createURI(UriTemplate.java:871)
at org.glassfish.jersey.uri.internal.JerseyUriBuilder._build(JerseyUriBuilder.java:914)
at org.glassfish.jersey.uri.internal.JerseyUriBuilder.build(JerseyUriBuilder.java:831)
at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.servletRequestToContainerRequest(JerseyHandlerFilter.java:141)
at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter(JerseyHandlerFilter.java:86)
at com.amazonaws.serverless.proxy.internal.servlet.FilterChainHolder.doFilter(FilterChainHolder.java:84)
at com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler.doFilter(AwsLambdaServletContainerHandler.java:207)
at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:171)
at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:75)
at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:168)
at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:200)
at com.lithium.tocoma.reach.handlers.AssetHandler.handleRequest(AssetHandler.java:23)
at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:283)
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
java.lang.IllegalArgumentException: Illegal character """ at position 7 is not allowed as a start of a name in a path template "query={"name":"faisal"}".
at org.glassfish.jersey.uri.internal.UriTemplateParser.parseName(UriTemplateParser.java:331)
at org.glassfish.jersey.uri.internal.UriTemplateParser.parse(UriTemplateParser.java:256)
at org.glassfish.jersey.uri.internal.UriTemplateParser.<init>(UriTemplateParser.java:115)
at org.glassfish.jersey.uri.UriTemplate.createUriComponent(UriTemplate.java:1004)
at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:970)
at org.glassfish.jersey.uri.UriTemplate.createURIWithStringValues(UriTemplate.java:906)
at org.glassfish.jersey.uri.UriTemplate.createURI(UriTemplate.java:871)
at org.glassfish.jersey.uri.internal.JerseyUriBuilder._build(JerseyUriBuilder.java:914)
at org.glassfish.jersey.uri.internal.JerseyUriBuilder.build(JerseyUriBuilder.java:831)
at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.servletRequestToContainerRequest(JerseyHandlerFilter.java:141)
at com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.doFilter(JerseyHandlerFilter.java:86)
at com.amazonaws.serverless.proxy.internal.servlet.FilterChainHolder.doFilter(FilterChainHolder.java:84)
at com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler.doFilter(AwsLambdaServletContainerHandler.java:207)
at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:171)
at com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler.handleRequest(JerseyLambdaContainerHandler.java:75)
at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:168)
at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:200)
at com.lithium.tocoma.reach.handlers.AssetHandler.handleRequest(AssetHandler.java:23)
at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:283)
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94)
Issue Analytics
- State:
- Created 5 years ago
- Comments:9
Top Results From Across the Web
Getting Error in JSON Parsing while sending an JSON object ...
Let's begin with the request. You cannot send a JSONObject directly to your server, you need to send it as a String and...
Read more >SyntaxError: JSON.parse: bad parsing - JavaScript | MDN
JSON.parse() parses a string as JSON. This string has to be valid JSON and will throw this error if incorrect syntax was encountered....
Read more >Is it a bad idea to pass JSON objects on the query string for an ...
We've implemented a few GET API calls using JSON in query string parameters. Currently we a struggeling with one of our client's IT ......
Read more >How to require query parameter A OR parameter B and throw ...
This error is happening due to, the request is sending the values as normal strings, but based on the RAML spec, is expecting...
Read more >ConvertFrom-Json (Microsoft.PowerShell.Utility)
The JSON string contains two key value pairs with keys that differ only in casing. Without the switch, the command would have thrown...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
I suspect it may have something to do with API Gateway/SAM CLI url-decoding the parameters and the library not re-encoding them before passing them to the framework. I’ll mark it as a bug and address it with the next release.
release 1.1.1 is going out to maven central