복붙노트

[SPRING] Spring RestTemplate 매개 변수로 GET

SPRING

Spring RestTemplate 매개 변수로 GET

사용자 지정 헤더 및 쿼리 매개 변수가 포함 된 REST 호출을 만들어야합니다. HttpEntity를 헤더 (본문 없음)로 설정하고 RestTemplate.exchange () 메서드를 다음과 같이 사용합니다.

HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");

Map<String, String> params = new HashMap<String, String>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);

HttpEntity entity = new HttpEntity(headers);

HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, params);

Dispatcher 서블릿이 처리기에 대한 요청을 해결할 수 없으므로 클라이언트 측에서 실패합니다. 디버깅을하면 요청 매개 변수가 전송되지 않는 것처럼 보입니다.

요청 본문과 쿼리 매개 변수를 사용하지 않고 POST로 교환을 수행하면 정상적으로 작동합니다.

누구든지 아이디어가 있습니까?

해결법

  1. ==============================

    1.URL / 경로 / 매개 변수 / 등을 쉽게 조작하려면 Spring의 UriComponentsBuilder 클래스를 사용할 수 있습니다. 문자열을 수동으로 연결하면 URL 인코딩이 처리됩니다.

    URL / 경로 / 매개 변수 / 등을 쉽게 조작하려면 Spring의 UriComponentsBuilder 클래스를 사용할 수 있습니다. 문자열을 수동으로 연결하면 URL 인코딩이 처리됩니다.

    HttpHeaders headers = new HttpHeaders();
    headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
    
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
            .queryParam("msisdn", msisdn)
            .queryParam("email", email)
            .queryParam("clientVersion", clientVersion)
            .queryParam("clientType", clientType)
            .queryParam("issuerName", issuerName)
            .queryParam("applicationName", applicationName);
    
    HttpEntity<?> entity = new HttpEntity<>(headers);
    
    HttpEntity<String> response = restTemplate.exchange(
            builder.toUriString(), 
            HttpMethod.GET, 
            entity, 
            String.class);
    
  2. ==============================

    2.uriVariables는 쿼리 문자열에서도 확장됩니다. 예를 들어, 다음 호출은 account와 name 값을 모두 확장합니다.

    uriVariables는 쿼리 문자열에서도 확장됩니다. 예를 들어, 다음 호출은 account와 name 값을 모두 확장합니다.

    restTemplate.exchange("http://my-rest-url.org/rest/account/{account}?name={name}",
        HttpMethod.GET,
        httpEntity,
        clazz,
        "my-account",
        "my-name"
    );
    

    실제 요청 URL은

    http://my-rest-url.org/rest/account/my-account?name=my-name
    

    자세한 내용은 HierarchicalUriComponents.expandInternal (UriTemplateVariables)을 참조하십시오. Spring의 버전은 3.1.3입니다.

  3. ==============================

    3.좋아요, 그래서 저는 바보가되어 쿼리 매개 변수를 URL 매개 변수와 혼동하고 있습니다. 못생긴 연결 문자열보다는 쿼리 매개 변수를 채울 수있는 더 좋은 방법이 있기를 바랬습니다. 그러나 거기에 우리가 있습니다. 올바른 매개 변수를 사용하여 URL을 작성한 것입니다. 문자열을 Spring으로 전달하면 인코딩도 처리합니다.

    좋아요, 그래서 저는 바보가되어 쿼리 매개 변수를 URL 매개 변수와 혼동하고 있습니다. 못생긴 연결 문자열보다는 쿼리 매개 변수를 채울 수있는 더 좋은 방법이 있기를 바랬습니다. 그러나 거기에 우리가 있습니다. 올바른 매개 변수를 사용하여 URL을 작성한 것입니다. 문자열을 Spring으로 전달하면 인코딩도 처리합니다.

  4. ==============================

    4.비슷한 것을 시도하고 있었고, RoboSpice 예제는 그것을 해결하는 데 도움이되었습니다.

    비슷한 것을 시도하고 있었고, RoboSpice 예제는 그것을 해결하는 데 도움이되었습니다.

    HttpHeaders headers = new HttpHeaders();
    headers.set("Accept", "application/json");
    
    HttpEntity<String> request = new HttpEntity<>(input, createHeader());
    
    String url = "http://awesomesite.org";
    Uri.Builder uriBuilder = Uri.parse(url).buildUpon();
    uriBuilder.appendQueryParameter(key, value);
    uriBuilder.appendQueryParameter(key, value);
    ...
    
    String url = uriBuilder.build().toString();
    
    HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request , String.class);
    
  5. ==============================

    5.적어도 봄 3 이후, UriComponentsBuilder를 사용하여 URL (약간 자세한 정보)을 작성하는 대신 RestTemplate 메소드 중 많은 부분이 매개 변수 경로에 자리 표시자를 받아들입니다.

    적어도 봄 3 이후, UriComponentsBuilder를 사용하여 URL (약간 자세한 정보)을 작성하는 대신 RestTemplate 메소드 중 많은 부분이 매개 변수 경로에 자리 표시자를 받아들입니다.

    문서에서 :

    참조 : https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri

    RestTemplate 용 JavaDoc을보고 "URI Template"을 검색하면 자리 표시자를 사용할 수있는 메소드를 볼 수 있습니다.

  6. ==============================

    6.나는 다른 접근 방식을 취한다. 동의하든 그렇지 않겠지 만 컴파일 된 자바 코드 대신 .properties 파일을 제어하려고한다.

    나는 다른 접근 방식을 취한다. 동의하든 그렇지 않겠지 만 컴파일 된 자바 코드 대신 .properties 파일을 제어하려고한다.

    endpoint.url = https : // yourHost / resource? requestParam1 = {0} & requestParam2 = {1}

    Java 코드가 여기에 오면 .properties 파일의 끝점 URL에 @PathVariable ({} 포함) 또는 @RequestParam (yourURL? key = value) 등이 있는지 알아 보려면 if 또는 switch 조건을 작성하고 그에 따라 메소드를 호출 할 수 있습니다. 그 방법은 역동적이어서 미래의 원 스톱 샵에서 코드를 변경할 필요가 없습니다 ...

    나는 실제 코드보다 더 많은 아이디어를주고 자 노력하고있다. @RequestParam과 @PathVariable 등을위한 일반적인 메소드를 작성하려고한다. 필요할 때마다 호출한다.

      @Value("${endpoint.url}")
      private String endpointURL;
      // you can use variable args feature in Java
      public String requestParamMethodNameHere(String value1, String value2) {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate
               .getMessageConverters()
               .add(new MappingJackson2HttpMessageConverter());
    
        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
        HttpEntity<String> entity = new HttpEntity<>(headers);
    
        try {
          String formatted_URL = MessageFormat.format(endpointURL, value1, value2);
          ResponseEntity<String> response = restTemplate.exchange(
                        formatted_URL ,
                        HttpMethod.GET,
                        entity,
                        String.class);
         return response.getBody();
        } catch (Exception e) { e.printStackTrace(); }
    
  7. ==============================

    7.RestTemplate에 매개 변수가 지정되지 않은 매개 변수를 전달하면 매개 변수를 고려하여 전달한 하나의 다른 URL에 대해 하나의 측정 항목을 갖게됩니다. 매개 변수화 된 URL을 사용하고 싶습니다.

    RestTemplate에 매개 변수가 지정되지 않은 매개 변수를 전달하면 매개 변수를 고려하여 전달한 하나의 다른 URL에 대해 하나의 측정 항목을 갖게됩니다. 매개 변수화 된 URL을 사용하고 싶습니다.

    http://my-url/action?param1={param1}&param2={param2}
    

    대신에

    http://my-url/action?param1=XXXX&param2=YYYY
    

    두 번째 경우는 UriComponentsBuilder 클래스를 사용하여 얻는 것입니다.

    첫 번째 동작을 구현하는 한 가지 방법은 다음과 같습니다.

    Map<String, Object> params = new HashMap<>();
    params.put("param1", "XXXX");
    params.put("param2", "YYYY");
    
    String url = "http://my-url/action?%s";
    
    String parametrizedArgs = params.keySet().stream().map(k ->
        String.format("%s={%s}", k, k)
    ).collect(Collectors.joining("&"));
    
    HttpHeaders headers = new HttpHeaders();
    headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
    HttpEntity<String> entity = new HttpEntity<>(headers);
    
    restTemplate.exchange(String.format(url, parametrizedArgs), HttpMethod.GET, entity, String.class, params);
    
  8. ==============================

    8.

    public static void main(String[] args) {
             HttpHeaders httpHeaders = new HttpHeaders();
             httpHeaders.set("Accept", MediaType.APPLICATION_JSON_VALUE);
             final String url = "https://host:port/contract/{code}";
             Map<String, String> params = new HashMap<String, String>();
             params.put("code", "123456");
             HttpEntity<?> httpEntity  = new HttpEntity<>(httpHeaders); 
             RestTemplate restTemplate  = new RestTemplate();
             restTemplate.exchange(url, HttpMethod.GET, httpEntity,String.class, params);
        }
    
  9. ==============================

    9.Spring Web 4.3.6에서도 볼 수있다.

    Spring Web 4.3.6에서도 볼 수있다.

    public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
    

    즉, 추한지도를 만들지 않아도된다는 뜻입니다.

    그래서 당신이이 URL을 가지고 있다면

    http://my-url/action?param1={param1}&param2={param2}
    

    너는 할 수있어.

    restTemplate.getForObject(url, Response.class, param1, param2)
    

    또는

    restTemplate.getForObject(url, Response.class, param [])
    
  10. from https://stackoverflow.com/questions/8297215/spring-resttemplate-get-with-parameters by cc-by-sa and MIT license