java - 如何使用 Apache Camel REST DSL (Servlet/ReSTLet) 设置 HTTP 状态代码原因

标签 java rest spring-boot apache-camel restlet

我有一个使用 Spring Boot 和 Apache Camel 构建的 Web 应用程序,并且正在实现 REST 接口(interface)。 目前,使用 Camel 默认 ServletReSTLet 组件,我没有在响应中获取 HTTP 状态代码原因。

以下是将 HTTP 状态代码设置为 403 时收到的示例响应:

< HTTP/1.1 403 
< Date: Mon, 19 Feb 2018 10:01:21 GMT
< Server: Restlet-Framework/2.4.0
< Content-Type: application/json
< Content-Length: 75

应该如何:

< HTTP/1.1 403 Forbidden
< Date: Mon, 19 Feb 2018 10:01:21 GMT
< Server: Restlet-Framework/2.4.0
< Content-Type: application/json
< Content-Length: 75

如何配置 Camel/ReSTLet/Servlet 以在 HTTP 状态代码中包含原因?

我当前的配置:

应用程序.java

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    private static final Logger appLogger = LoggerFactory.getLogger(Application.class);
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        appLogger.info("--Application Started--");
    }

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {

        SpringServerServlet serverServlet = new SpringServerServlet();
        ServletRegistrationBean regBean = new ServletRegistrationBean(serverServlet, "/*");

        Map<String,String> params = new HashMap<>();
        params.put("org.restlet.component", "restletComponent");

        regBean.setInitParameters(params);

        return regBean;
    }


    @Bean
    public Component restletComponent() {
        return new Component();
    }

    @Bean
    public RestletComponent restletComponentService() {
        return new RestletComponent(restletComponent());
    }

}

路由配置:

@Component
public class RestRouteBuilder extends RouteBuilder {
    private static final Logger appLogger = LoggerFactory.getLogger(RestRouteBuilder.class);
    private Predicate isAuthorizedRequest = header(HttpHeaders.AUTHORIZATION).isNotNull();

    @Override
    public void configure() throws Exception {
        restConfiguration().component("restlet")
                           .contextPath("/overlay")
                           .bindingMode(RestBindingMode.json)
                           .skipBindingOnErrorCode(false)
                           .dataFormatProperty("prettyPrint", "true");

        rest("/")
                .get()
                .route()
                .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(403))
                .setBody(constant("Forbidden"))
                .endRest();
    }
}

我还尝试添加 .setHeader(Exchange.HTTP_RESPONSE_TEXT,constant("Forbidden")) 但结果是相同的。

最佳答案

.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(403))
.setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
.setBody(constant("Forbidden"))

关于java - 如何使用 Apache Camel REST DSL (Servlet/ReSTLet) 设置 HTTP 状态代码原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48864005/

相关文章:

java RSA多重加密

java - 宏记录器/播放器

javascript - 下载带有 http header 的文件

php - Rest Api 的服务器端实现

java - Spring 中的抽象 Controller

spring-boot - 在从 3rd 方库扩展的类上使用 Lombok 的 @SuperBuilder 概念

java - 当我从批处理文件运行 Java 时,我可以 Hook 批处理文件来强制退出吗?

asp.net-mvc - 具有复杂操作(动词)的 RESTful Web 服务

Spring Boot - DevTools - RestController 在重建项目时并不总是映射

java - 如何使用 Java 解析后台进程的输出?