如何在 Spring Get API 中接受对象数组作为请求参数
How to accept an array of object as request param in Spring Get API
我正在使用第 3 方网格,当输入字符时生成以下 GET API:
http://localhost:4200/api/v1/driver/getDriverListForDropDown?firstName=[{%22field%22:%22DriverCode%22,%22operator%22:%22startsWith%22,%22value%22:%2212345%22,%22caseSensitive%22:false}]
生成的请求参数:
firstName:[{"field":"DriverCode","operator":"startsWith","value":"*","caseSensitive":false}]
我正在尝试在 spring 启动时创建休息 API,但无法点击 API。
我尝试了以下方法:
@GetMapping(path = "/getDriverListForDropDown")
public ResponseEntity<RestApiResponse<List<DriverDataForDropDown>>> getDriverListForDropDown(
@ApiIgnore Context context, @RequestParam(value="firstName") List<DriverDropdownFilterRequest> firstName)
DriverDropdownFilterRequest :
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
@JsonIgnoreProperties(ignoreUnknown = true)
@Builder(toBuilder = true)
public class DriverDropdownFilterRequest
{
String field;
String operator;
String value;
}
但我总是收到 400 错误,并且在后端出现以下错误:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:468) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.29.jar:9.0.29]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.29.jar:9.0.29]
我尝试了几个选项,但没有任何效果。请帮忙。
我想,正如您的异常提示,请检查您的请求格式是否有效(可能 firstName 参数中的字符 '[' 和 ']' 矛盾),或者您的 tomcat 版本支持您的格式,请参考这个post.
建议:也许不给参数分配 hash-like 值,您可以通过创建新参数(不仅仅是名字)或通过设置能够接受主体的 API 点来分隔它们json。例如
@GetMapping(path = "/get")
public ResponseEntity<...> get(..., @RequestBody Map<...> firstname)
{
.
.
.
}
干杯!
问题是第 3 方没有正确编码参数,tomcat 拒绝了这些字符。
即使在 application.properties 中添加宽松的字符也没有用。
唯一可行的解决方案是添加以下配置:
@Component
public class TomcatWebServerCustomizer implements
WebServerFactoryCustomizer<TomcatServletWebServerFactory>
{
/**
* Customize the specified
* @param factory the web server factory to customize
*/
@Override
public void customize(TomcatServletWebServerFactory factory)
{
factory.addConnectorCustomizers(connector ->
connector.setAttribute("relaxedQueryChars", "<>[\]^`{|}"));
}
}
我正在使用第 3 方网格,当输入字符时生成以下 GET API:
http://localhost:4200/api/v1/driver/getDriverListForDropDown?firstName=[{%22field%22:%22DriverCode%22,%22operator%22:%22startsWith%22,%22value%22:%2212345%22,%22caseSensitive%22:false}]
生成的请求参数:
firstName:[{"field":"DriverCode","operator":"startsWith","value":"*","caseSensitive":false}]
我正在尝试在 spring 启动时创建休息 API,但无法点击 API。
我尝试了以下方法:
@GetMapping(path = "/getDriverListForDropDown")
public ResponseEntity<RestApiResponse<List<DriverDataForDropDown>>> getDriverListForDropDown(
@ApiIgnore Context context, @RequestParam(value="firstName") List<DriverDropdownFilterRequest> firstName)
DriverDropdownFilterRequest :
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
@JsonIgnoreProperties(ignoreUnknown = true)
@Builder(toBuilder = true)
public class DriverDropdownFilterRequest
{
String field;
String operator;
String value;
}
但我总是收到 400 错误,并且在后端出现以下错误:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:468) ~[tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) [tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.29.jar:9.0.29] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.29.jar:9.0.29]
我尝试了几个选项,但没有任何效果。请帮忙。
我想,正如您的异常提示,请检查您的请求格式是否有效(可能 firstName 参数中的字符 '[' 和 ']' 矛盾),或者您的 tomcat 版本支持您的格式,请参考这个post.
建议:也许不给参数分配 hash-like 值,您可以通过创建新参数(不仅仅是名字)或通过设置能够接受主体的 API 点来分隔它们json。例如
@GetMapping(path = "/get")
public ResponseEntity<...> get(..., @RequestBody Map<...> firstname)
{
.
.
.
}
干杯!
问题是第 3 方没有正确编码参数,tomcat 拒绝了这些字符。
即使在 application.properties 中添加宽松的字符也没有用。
唯一可行的解决方案是添加以下配置:
@Component
public class TomcatWebServerCustomizer implements
WebServerFactoryCustomizer<TomcatServletWebServerFactory>
{
/**
* Customize the specified
* @param factory the web server factory to customize
*/
@Override
public void customize(TomcatServletWebServerFactory factory)
{
factory.addConnectorCustomizers(connector ->
connector.setAttribute("relaxedQueryChars", "<>[\]^`{|}"));
}
}