【问题标题】:How to build a rest service accepting any request?如何建立一个接受任何请求的休息服务?
【发布时间】:2019-10-29 07:25:21
【问题描述】:

我想测试我的集成服务。因此,我需要一个休息服务,它接受任何对任何 url 的请求并以 HTTP 200 响应 - 好的。 (后面的答案应该是可配置的,基于 url。)

如何使用 spring-boot 构建这样的服务?


我尝试使用自定义 HandlerInterceptor,但这只有在 url 暴露时才有效:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new AllAccessInterceptor());
  }

  private static class AllAccessInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle() {
      response.setStatus(HttpServletResponse.SC_OK);
      return true;
    }

  }

}

【问题讨论】:

  • 那么您是否要将集成的服务 URL 和 HTTP 方法作为请求参数传递给测试休息服务?
  • 这不是我想要的。该项目仅公开 2 个端点。我希望能够针对我能想到的任何端点进行 GET、POST 和 PATCH,而无需实现端点。
  • @sadia 不完全是。我想在本地启动我的接受器服务。比将其配置为我想在我的机器上手动开发测试的服务的远程服务。

标签: java rest spring-boot


【解决方案1】:

我认为整个 spring boot 尤其是 spring mvc 并不打算简单地做到这一点,因此任何解决方案都不会简单明了。

所以,是的,拦截器在技术上可以成为一种解决方案,但是,您将如何配置实际答案(除了 200 状态之外,还应该有一些数据发送回调用方部分)。要检查的请求是一个发布请求,并且您希望检查一个非常具体的表单的正文。

根据您的评论

我想在本地启动我的接受器服务。比将其配置为我想在我的机器上手动开发测试的服务的远程服务。

考虑使用Wiremock 作为模拟服务器。它的工作原理很像 mockito: 您将能够指定期望,例如“如果我使用以下参数调用远程服务 -> 返回该答案”等等。从技术上讲,它回答了您的问题,因为您确实不需要为每个期望规范实现 enpoint,而这正是 wiremock 所做的。

您甚至可以在测试期间使用 docker 中的测试容器运行它,以便它在测试开始时启动并在测试结束时停止,但它是不同的主题。

【讨论】:

  • 谢谢,这正是我想要的。
【解决方案2】:

我自己找到了答案。

我需要返回false,而不是在preHandle 方法中返回true。这将不允许进一步执行Interceptors

【讨论】:

    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多