복붙노트

[SPRING] Spring RestTemplate에서 JSON으로 표현 된 쿼리 매개 변수를 사용하는 방법은 무엇입니까?

SPRING

Spring RestTemplate에서 JSON으로 표현 된 쿼리 매개 변수를 사용하는 방법은 무엇입니까?

Spring RestTemplate을 사용하여 JSON으로 표현 된 쿼리 매개 변수가있는 HTTP 끝점에 요청해야합니다.

restTemplate.getForObject(
    apiRoot + "/path" + "?object={myObject}",
    Response.class,
    new MyObject())

여기에 MyObject가 JSON (및 URL 인코딩 된 코드로 변환)으로 변환되어야합니다. 그러나 RestTemplate은 대신 toString 호출로이를 String으로 변환합니다. MyObject는 Jackson에 의해 JSON으로 변환 가능합니다. UriComponentsBuilder도 같은 방식으로 작동합니다.

UriComponentsBuilder.fromHttpUrl(apiRoot)
    .path("/path")
    .queryParam("object", new MyObject()))
    .queryParam("access_token", accessToken)
    .toUri()

손으로 ObjectMapper.writeValueAsString을 호출하지 않도록하는 방법이 있습니까?

업데이트 : 결과에서 명확히하기 위해 MyObject가 제공하는 URL (또는 URL 인코딩 형식의 object? % 7B % 22key % 22 % 3A42 % 7D)에? object = { "key": 42} 값이 42 인 속성 키

해결법

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

    1.writeValueAsString을 사용할 때의 문제점은 무엇입니까? 설명해 주시겠습니까?

    writeValueAsString을 사용할 때의 문제점은 무엇입니까? 설명해 주시겠습니까?

    내 마음에 오는 유일한 해결책은 (나는 Jackson이이 객체가 그 순간에 연재되어야한다는 것을 알 수있는 방법이 있다면 나는 생각하지 않는다) :

    @Autowired
    ObjectMapper objectMapper;
    
    @Override
    public void run(String... strings) throws Exception {
    
        String urlBase = "http://localhost:8080/path";
    
        RestTemplate restTemplate = new RestTemplate();
    
        String url;
        MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
        params.set("object", objectMapper.writeValueAsString(new MyObject()));
    
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(urlBase).queryParams(params);
        url = builder.build().toUri().toString();
    
        LOGGER.info("Composed before decode: " + url);
    
        //restTemplate.getForObject(url, Void.class);
    
        url = URLDecoder.decode(url, "UTF-8");
    
        LOGGER.info("Composed after decode: " + url);
    }
    

    산출:

    2016-04-05 16:06:46.811  INFO 6728 --- [main] com.patrykwoj.StackOverfloApplication    : Composed before decode: http://localhost:8080/path?object=%7B%22key%22:43%7D
    2016-04-05 16:06:46.941  INFO 6728 --- [main] com.patrykwoj.StackOverfloApplication    : Composed after decode: http://localhost:8080/path?object={"key":43}
    

    편집하다:

    요청 매개 변수로 JSON 객체를 보내는 것은 일반적으로 좋은 생각이 아닙니다. 예를 들어 JSON 내부의 중괄호에 문제가있을 수 있습니다.

  2. from https://stackoverflow.com/questions/36423202/how-to-use-query-parameter-represented-as-json-with-spring-resttemplate by cc-by-sa and MIT license