Spring Web调用带参数接口报405 Method Not Allowed问题求助
问题原因
你的接口定义中fetchMovieById使用了@PathVariable注解接收参数,对应@GetMapping("/{movieId}")的路径规则,要求参数必须放在URL路径中,而非作为查询参数拼接在?后面。
你当前请求的地址是http://localhost:8080/api/movies?movieId=619fa9d9b0c30252474b9a01,这个地址匹配到的是无后缀路径的/api/movies接口,该路径仅支持GET(查询全量)和POST(新增)两种请求方式,如果你用其他请求方式访问、或者Spring无法匹配到对应带参数的接口规则时,就会返回405 Method Not Allowed错误。
解决方案
方案1:调整请求URL适配现有接口
直接将参数放在URL路径中即可,比如查询单个电影的请求改为:GET http://localhost:8080/api/movies/619fa9d9b0c30252474b9a01
其余带路径参数的PUT、DELETE等接口也遵循同样规则,把参数放到路径中而非作为查询参数传递即可正常访问。
方案2:修改接口适配查询参数传值
如果你确实需要使用?movieId=xxx的形式传参,可以调整接口定义,将路径变量改为查询参数,同时通过params属性避免和查询全量的接口冲突:
// 查询全量接口保持不变 @GetMapping public List<Movie> fetchAllMovie() { return movieService.getAllMovie(); } // 新增params限定,只有请求携带movieId参数时匹配该接口 @GetMapping(params = "movieId") public MovieDto fetchMovieById(@RequestParam("movieId") String movieId) throws MovieNotFoundException { Movie movie = movieRepository.findById(movieId).orElseThrow(MovieNotFoundException::new); return movieMapper.modelToDto(movie); }
内容的提问来源于stack exchange,提问作者csabit1000
相关产品推荐
相关产品推荐

