spring - Spring 使用数组查询参数响应 400
问题描述
我有以下spring boot @RestController 请求映射:
@RequestMapping({"/api/blog"})
@RestController
public class BlogController {
@RequestMapping(value = "/test", method = RequestMethod.GET)
public Iterable<Blog> filterBy(
@RequestParam(required = false, name = "filter") String filterStr,
@RequestParam(required = false, name = "range") String rangeStr,
@RequestParam(required = false, name="sort") String sortStr) {
...
}
}
请求应如下所示:
GET http://my.api.url/api/blog/test?sort=['title','ASC']&range=[0, 24]&filter={title:'bar'}
但是,提供任何数组查询参数(范围和/或排序)会导致 400 响应,除了:“HTTP 状态 400 - 错误请求”之外没有其他详细信息
仅使用文件管理器查询参数发出请求有效。添加范围和/或使用空值排序有效。当我添加括号 [] 时,它似乎失败了。
我尝试添加以下异常处理程序来调试控制器和 ControllerAdvice 类的问题:
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handle(HttpMessageNotReadableException e) {
logger.warn("Returning HTTP 400 Bad Request", e);
}
但是,这不会被触发。我怀疑框架中发生了某些事情,导致 400 甚至在到达控制器之前。
任何帮助表示赞赏。
解决方案
您必须对参数进行 URL 编码!测试时,您应该对过滤器、范围和排序参数进行 URL 编码。尝试以下操作:
http://my.api.url/api/blog/test?sort%3D%5B%27title%27%2C%27ASC%27%5D%26range%3D%5B0%2C+24%5D%26filter%3D%7Btitle%3A%27bar%27%7D
推荐阅读
- firebase - 获取错误 FirebaseError:缺少权限或权限不足
- oracle - Oracle SQL LAG 函数在 Time 中返回错误的计算
- amazon-web-services - 根据 Dynamo DB 属性在 AWS step 函数中安排提醒电子邮件(通过事件/SES)
- c# - 如何在没有依赖注入的情况下使用 ILogger?
- javascript - JavaScript:字典列表(JSON)到 csv
- javascript - 根据属性最小值和最大值过滤对象数组
- macos - ZeroBrane Studio 无法运行?(苹果系统)
- reactjs - redux 处理获取响应数据和更新存储
- c++ - (有效)QFileInfo 在 std::sort 中调用 QFileInfo::filename() 时会导致 segv
- python - GradientTape 张量流中的多个训练变量