Spring Cloud API Gateway передает Dynami c Значение параметра - PullRequest
0 голосов
/ 26 мая 2020

Я изучаю, как создать API-шлюз с помощью Spring Cloud. Я просмотрел документацию о том, как передать параметр, и все примеры, кажется, показывают, что они жестко запрограммированы. Но что, если у меня есть значение Dynami c?

Например, у меня есть такой тип запроса: http://localhost: 8080 / people / lookup? SearchKey = jdoe ,

Как передать "jdoe" часть?

Я пробовал следующий код, и он работает, только если я жестко закодирую значение в коде. т.е. .filters(f -> f.addRequestParameter("searchKey", "jdoe"). Этот тест также доказывает, что мой сервер обнаружения (Eureka) работает.

Я не уверен, как получить доступ к значению с помощью предоставленных методов построения. Это такой простой сценарий, но я с удивлением обнаружил, что для него не так много примеров или документации, так что это должен быть только я.

@SpringBootApplication
@EnableEurekaClient
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("people-service", r -> r.path("/people/active-associates")
                        .uri("lb://people-service"))
                .route(r -> r.path("/people/lookup")
                          .filters(f -> f.addRequestParameter("searchKey",  howDoIPassDynamicValueHere))
                          .uri("lb://people-service")
                          .id("addrequestparameter_route"))
                .build();
    }

Это, очевидно, сработало, когда я позвонил в службу напрямую, потому что мой Контроллер микросервисов обрабатывает это так, используя @RequestParam ... довольно просто:

@RestController
@RequestMapping(value = "/people")
public class PersonController {

    @Autowired
    private PersonService personService;

    /**
     * Searches by FirstName, Lastname or NetworkId.
     * 
     * @param searchKey
     * @return ResponseEntity<List<Person>>
     */
    @GetMapping(value = "/lookup")
    public ResponseEntity<List<Person>> findPersonsBySearchKey(@RequestParam(name = "searchKey") String searchKey) {
        List<Person> people = personService.findActivePersonsByFirstLastNetworkId(searchKey.trim().toLowerCase());
        return new ResponseEntity<List<Person>>(people, HttpStatus.OK);
    }
    }

1 Ответ

0 голосов
/ 27 мая 2020

Благодаря комментариям это стало для меня осмысленным. Думаю, я слишком подумал, когда прочитал документацию о методе фильтра addRequestParameter (). Я подумал, что мне нужно будет использовать этот метод, если у моих запросов есть параметры. Я чешу затылок целый день, и не могу поверить, что это так просто. Итак, я заработал, просто удалив этот фильтр:

@SpringBootApplication
@EnableEurekaClient
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("people-service", r -> r.path("/people/active-associates")
                        .uri("lb://people-service"))
                .route(r -> r.path("/people/lookup")
                          .uri("lb://people-service"))
                .build();
    }
}
...