简体   繁体   English

Spring Boot:使用 Rest 模板管理多个端点?

[英]Spring Boot: Manage Multiple Endpoint with Rest Template?

In my Spring Boot project I have set several endpoints (which refer to some GET or POST REST API) in the application-dev.yml file.在我的 Spring Boot 项目中,我在 application-dev.yml 文件中设置了几个端点(指的是某些 GET 或 POST REST API)。

spring:
    username: xxx
    password: acb132
    route:
      source:
        protocol: https://
        ip: 10.xxx.y.zz/
        root: "swdfr/"
        paths: >
            - "ofh/ert/hAFG5"
            - "ofh/ert/ryt54"

I would like to manage these endpoints within a service class with a single method.我想使用单一方法在服务类中管理这些端点。 Currently I have implemented this solution:目前我已经实施了这个解决方案:

//REST CONTROLLER
    @GetMapping("/Multiple_Get")
    public void manageGetEndpointsWithRestTemplate() throws Exception{
    final String methodName = "manageGetEndpointsWithRestTemplate()";
        try {
            service.manageGetEndpointsWithRestTemplate();
        } catch (final Exception e) {
            this.errorLog(methodName, e);
            throw e;
        }   
    }
    
//SERVICE
    @ResponseBody
    public void manageGetEndpointsWithRestTemplate() {
        final String methodName = "manageGetEndpointsWithRestTemplate()";
        try {
            String urlGet1 = protocol + ip + root + paths.get(0);
            String urlGet2 = protocol + ip + root + paths.get(1);

            HttpHeaders headers = new HttpHeaders();
            headers.setBasicAuth(username, password);
            HttpEntity request = new HttpEntity(headers);

            try {
                RestTemplate restTemplate;
                if (urlGet1.startsWith("https") || urlGet2.startsWith("https")) {
                    restTemplate = getRestTemplateForSelfSsl();
                } else {
                    restTemplate = new RestTemplate();
                }

                // GET1
                ResponseEntity<String> response1 = restTemplate.exchange(urlGet1, HttpMethod.GET, request,
                        String.class);
                HttpStatus statusCode1 = response1.getStatusCode();
                logger.info("STATUS GET1: " + statusCode1);
                
                // GET2
                ResponseEntity<String> response2 = restTemplate.exchange(urlGet2, HttpMethod.GET, request,
                        String.class);
                HttpStatus statusCode2 = response2.getStatusCode();
                logger.info("STATUS GET2: " + statusCode2);
                
            } catch (HttpStatusCodeException e) {
                logger.error(e.getMessage());
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

public RestTemplate getRestTemplateForSelfSsl()
        throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
    TrustStrategy acceptingTrustStrategy = (X509Certificate[] x509Certificates, String s) -> true;
    SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy)
            .build();
    SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
    CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(httpClient);
    RestTemplate restTemplate = new RestTemplate(requestFactory);
    return restTemplate;
}

I would like to use a single method making it as generalizable as possible especially if I have to manage a large number of endpoints.我想使用一种方法使其尽可能通用,特别是如果我必须管理大量端点。 Do you have any ideas?你有什么想法? Thanks in advance提前致谢

You can iterate over all the paths and execute the common code, considering you are doing GET request for all.考虑到您正在为所有paths执行GET请求,您可以遍历所有paths并执行公共代码。

@ResponseBody
public void manageGetEndpointsWithRestTemplate() {
    final String methodName = "manageGetEndpointsWithRestTemplate()";
    try {
        paths.forEach(path -> {
            String urlGet = protocol + ip + root + path;
            HttpHeaders headers = new HttpHeaders();
            headers.setBasicAuth(username, password);
            HttpEntity request = new HttpEntity(headers);
            try {
                RestTemplate restTemplate = urlGet.startsWith("https") ? getRestTemplateForSelfSsl() : new RestTemplate();
                ResponseEntity<String> response = restTemplate.exchange(urlGet, HttpMethod.GET, request,
                        String.class);
                HttpStatus statusCode = response.getStatusCode();
                logger.info("STATUS GET - {} : {}", urlGet, statusCode);
            } catch (HttpStatusCodeException e) {
                logger.error(e.getMessage());
            }
        });
    } catch (Exception e) {
        logger.error(e.getMessage());
    }
}

In case you're gonna use POST or any other HTTP methods, mention in application-dev.yml file along with the paths .如果您要使用POST或任何其他 HTTP 方法,请在application-dev.yml文件中与paths一起提及。 Add few extra logic to determine the HTTP.XXX before passing into restTemplate.exchange() .在传递到restTemplate.exchange()之前添加一些额外的逻辑来确定HTTP.XXX

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM