为了账号安全,请及时绑定邮箱和手机立即绑定

swagger-ui 中的 OPTIONS、HEAD、PATCH 方法

swagger-ui 中的 OPTIONS、HEAD、PATCH 方法

慕少森 2021-11-17 14:58:35
我是使用 Swagger 的新手我已经实现了一个 SwaggerConfig 类和一个 RestController。在我的 RestController 中,我只实现了 GET、POST、PUT、DELETE,但是 swagger 还生成了 OPTIONS 和 HEAD 的方法?这是什么原因?它们是否总是默认从 Swagger 生成?产生这些方法的原因是什么?提前致谢。@RestControllerpublic class TimesheetRequestController {@AutowiredTimesheetRepository timeRepo;@RequestMapping("/timesheets")public List<Timesheet> getTimesheets() {    List<Timesheet> results = new ArrayList<>();    timeRepo.findAll().forEach(results::add);    return results;}@PostMapping("/timesheets")@ApiParam(type="Timesheet")public ResponseEntity<Object> createTimesheetEntry(@RequestBody Timesheet timesheet) {    Timesheet savedTimesheet = timeRepo.save(timesheet);    URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")            .buildAndExpand(savedTimesheet.getId()).toUri();    return ResponseEntity.created(location).build();}@PutMapping("/timesheets")public ResponseEntity<Object> getTimesheetEntry(@RequestBody Timesheet timesheet, @PathVariable long id) {    Optional<Timesheet> timesheetOptional = timeRepo.findById(id);    if (!timesheetOptional.isPresent())        return ResponseEntity.notFound().build();    timesheet.setId(id);    timeRepo.save(timesheet);    return ResponseEntity.noContent().build();}@GetMapping("/timesheets/{id}")public Timesheet getTimesheetEntry(@PathVariable long id) {    Optional<Timesheet> timesheet = timeRepo.findById(id);    if (!timesheet.isPresent())        throw new TimesheetNotFoundException("id-" + id);    return timesheet.get();}@DeleteMapping("/timesheets/{id}")public void deleteTimesheetEntry(@PathVariable long id) {    timeRepo.deleteById(id);}}这是我的 Swagger 配置:@Configuration@EnableSwagger2public class SwaggerConfig {    @Bean    public Docket api() {        return new Docket(DocumentationType.SWAGGER_2)                .select()                .apis(RequestHandlerSelectors.basePackage("package_name"))                .paths(PathSelectors.any())                .build();    }}
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

像这样改变你的功能。


@RequestMapping(path="/timesheets",method=RequestMethod.GET)

public List<Timesheet> getTimesheets() {


    List<Timesheet> results = new ArrayList<>();

    timeRepo.findAll().forEach(results::add);


    return results;

}

甚至将其更改为 @GetMapping("/timesheets")


这一个类似于这个问题。


查看完整回答
反对 回复 2021-11-17
?
浮云间

TA贡献1829条经验 获得超4个赞

虽然它被称为 REST,它指的是 4 个基本操作,但 HEAD 和 OPTIONS 方法也常被 REST 客户端使用。所以 Swagger 也会自动列出处理这些 http 方法的控制器方法。


并且因为您尚未为此控制器方法定义任何方法参数:


@RequestMapping("/timesheets")

public List<Timesheet> getTimesheets() {


    List<Timesheet> results = new ArrayList<>();

    timeRepo.findAll().forEach(results::add);


    return results;

}

...所有其他控制器方法(由于更严格的匹配参数)未采用的所有请求都将重定向到此处。所以 Swagger 将列出它们。


如果您不想允许 HEAD 和 OPTIONS 然后更改@RequestMapping("/timesheets")为@GetMapping("/timesheets")


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 732 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信