2016-12-27 86 views
0

我试图使用过滤器Zuul做动态路由的工作。我有一个在Spring Boot中运行的应用程序。此应用程序公开两项服务。重定向不与Zuul春季启动

@PostMapping("/update") 
public String updateBook(Book book) { 
    return " Book Updated"; 
} 
@PostMapping("/add") 
public String addBook(Book book) { 
    return " Book Added"; 
} 

Application.properties这个应用程序是

spring.application.name=book 
server.port=8090 

在我zuul过滤器,我重定向任何要求要么/或更新/添加基于某种逻辑。

Zuul配置如下。

zuul.routes.books.url=http://localhost:8090 
ribbon.eureka.enabled=false 
server.port=8080 

重定向是使用下面的代码在一个延伸ZuulFilter

@Override 
public Object run() { 
    RequestContext context = RequestContext.getCurrentContext(); 
    String requestBody = CharStreams.toString(context.getRequest().getReader()); 
    Gson gson = new Gson(); 
    Book book = gson.fromJson(requestBody, Book.class); 

    if (book.getType().equals("update")) { 

     context.setRouteHost(new URL("http://localhost:8090/update")); 
    } 
    else { 
     context.setRouteHost(new URL("http://localhost:8090/add")); 
    } 
    return null; 
} 

当我调用

curl -i -X POST -H "Content-Type:application/json" -d "{\"id\":\"1\", \"name\":\"Book1\", \"type\":\"update\"}" http://localhost:8080/books/add 

我希望它应该重定向到/更新服务的过滤器类来完成在run()因为类型是作为更新传递的。但是我发现它是被调用的添加服务。 setRouteHost代码正在执行,但重定向没有发生。

有什么我失踪?任何指针将不胜感激。

谢谢

回答

0

我能够通过使用下面的代码得到这个工作。

if (book.getType().equals("update")) { 
    context.setRouteHost(new URL("http://localhost:8090")); 
    context.addOriginResponseHeader("X-Zuul-Service","http://localhost:8090"); 
    context.put("requestURI", "/update"); 
}