'how to migrate Resttemplate to Webclient?

I'm making API for GatherTown Map to insert object with spring.

It works fine when using Resttemplate to post request.

I wanted to migrate this to Webclient, so I searched and tried all day, but all failed.

public String withRestTemplate(RequestDto requestDto){

        ResponseDto gatherTownMap = getMap(requestDto).share().block();

        SampleObject gatherTownSampleMusic = new GatherTownSampleMusic();
        gatherTownSampleMusic.setX(10);
        gatherTownSampleMusic.setY(10);
        gatherTownSampleMusic.sound.setSrc("https://cdn.gather.town/storage.googleapis.com/gather-town.appspot.com/internal-dashboard/sounds/jAlXIofmjkQFHBM_oYl-F");
        gatherTownSampleMusic.sound.setLoop(false);
        gatherTownSampleMusic.sound.setVolume(0.5);
        gatherTownSampleMusic.sound.setMaxDistance(30);

        gatherTownMap.getObjects().add(gatherTownSampleMusic);

        requestDto.setMapContent(gatherTownMap);
        requestDto.setSpaceId(requestDto.getSpaceId().replace("/", "\\").replace("%20", " "));

        HttpHeaders headers = new HttpHeaders();
        headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<RequestDto> entity = new HttpEntity<>(requestDto, headers);
        return restTemplate.exchange(
                apiUrl,
                HttpMethod.POST,
                entity,
                String.class
        ).getBody();
}

My Failed Webclient

public String withWebclient(RequestDto requestDto){

        ResponseDto gatherTownMap = getMap(requestDto).share().block();

        SampleObject gatherTownSampleMusic = new GatherTownSampleMusic();
        gatherTownSampleMusic.setX(10);
        gatherTownSampleMusic.setY(10);
        gatherTownSampleMusic.sound.setSrc("https://cdn.gather.town/storage.googleapis.com/gather-town.appspot.com/internal-dashboard/sounds/jAlXIofmjkQFHBM_oYl-F");
        gatherTownSampleMusic.sound.setLoop(false);
        gatherTownSampleMusic.sound.setVolume(0.5);
        gatherTownSampleMusic.sound.setMaxDistance(30);

        gatherTownMap.getObjects().add(gatherTownSampleMusic);

        requestDto.setMapContent(gatherTownMap);
        requestDto.setSpaceId(requestDto.getSpaceId().replace("/", "\\").replace("%20", " "));

        WebClient client = WebClient.create(apiUrl);
        return  client.
                post().
                contentType(MediaType.APPLICATION_JSON).
                accept(MediaType.APPLICATION_JSON).
                bodyValue(requestDto).
                retrieve().
                bodyToMono(String.class).block();
}

this is RequestDto Class.

public class RequestDto {

    private String apiKey;
    private String spaceId;
    private String mapId;
    private ResponseDto mapContent;
    
    static class ResponseDto {
    private String mostRecentUpdateId;
    private List<Long> dimensions;
    private String foregroundImagePath;
    private List<Object> spaces;
    private String collisions;
    private Boolean isTemplate;
    private String backgroundImagePath;
    private Long objectSizes;
    private Boolean useDrawnBG;
    private List<Object> assets;
    private String id;
    private Boolean isPublic;
    private List<Object> announcer;
    private List<Object> spawns;
    private String version;
    private List<Object> objects;
    private List<Object> portals;
    }

}

How can i migrate my Resttemplate method to Webclient?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source