관리 메뉴

bright jazz music

WebClient 02 : POST 본문

Framework/Spring

WebClient 02 : POST

bright jazz music 2023. 3. 8. 09:04

요약

  • WebClientPostService.java를 생성하여 WebClient 요청, 응답 수신 로직을 작성한다.
  • 응답을 브라우저에서 확인할 수 있도록 WebClientController.java 파일에 경로를 작성한다.
  • 이해에 용이하도록 요청 측 controller - 요청측 service - 수신 측 controller - 결과 순으로 내요을 구성하였다. 

1. WebClientController.java 작성(요청 측 컨트롤러 http://localhost:8080)

//WebClientController.java

package com.project.base.controller;

import com.project.base.domain.MemberDto;
import com.project.base.service.WebClientGetService;
import com.project.base.service.WebClientPostService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/web-client")
public class WebClinetController {

    private final WebClientGetService webClientGetService;
    private final WebClientPostService webClientPostService;

    public WebClinetController(WebClientGetService webClientGetService, WebClientPostService webClientPostService) {
        this.webClientGetService = webClientGetService;
        this.webClientPostService = webClientPostService;
    }



    /**
     * POST
     */

    @GetMapping("post-with-param-and-body")
    public ResponseEntity<MemberDto> postWithParamAndBody() {
        return webClientPostService.postWithParamAndBody();
    }

    @GetMapping("post-with-header")
    public ResponseEntity<MemberDto> postWithHeader() {
        return webClientPostService.postWithHeader();
    }
}

 

2. WebClientPostService.java 작성(요청 측 서비스)

//WebClientPostService.java

package com.project.base.service;

import com.project.base.domain.MemberDto;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

@Service
public class WebClientPostService {

    public ResponseEntity<MemberDto> postWithParamAndBody() {
        WebClient webClient = WebClient.builder()
                .baseUrl("http://localhost:9090")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .build();

        MemberDto memberDto = new MemberDto();
        memberDto.setName("dognails");
        memberDto.setEmail("dognails@gmail.com");
        memberDto.setOrganization("dognails company");

        return webClient.post().uri(uriBuilder -> uriBuilder.path("/api/v1/crud-api")
                .queryParam("name", "catnails")
                .queryParam("email", "catnails@gmail.com")
                .queryParam("organization", "catnails company")
                .build())
            .bodyValue(memberDto)
            .retrieve()
            .toEntity(MemberDto.class)
            .block();
    }

    public ResponseEntity<MemberDto> postWithHeader() {
        WebClient webClient = WebClient.builder()
                .baseUrl("http://localhost:9090")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .build();

        MemberDto memberDto = new MemberDto();
        memberDto.setName("dognails");
        memberDto.setEmail("dognails@gmail.com");
        memberDto.setOrganization("dognails company");

        return webClient.post()
                .uri(uriBuilder -> uriBuilder.path("/api/v1/crud-api/add-header")
                        .build())
                .bodyValue(memberDto)
                .header("my-header", "catnails API")
                .retrieve()
                .toEntity(MemberDto.class)
                .block();
    }
}

 

3. 수신 측 서버 컨트롤러 작성(http://localhost:9090)

 

요청을 받는 서버 설정

//외부 API 역할을 하는 서버 => server.port=9090
package com.project.base.controller;

import com.project.base.domain.MemberDto;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/crud-api")
public class CrudController {


    /* POST: RequestParameter와 RequestBody를 받는 경우. (귀찮아서 한 번에 해버리는 예시) */
    @PostMapping
    public ResponseEntity<MemberDto> getMember(@RequestBody MemberDto request, @RequestParam String name,
                                               @RequestParam String email, @RequestParam String organization) {

        System.out.println("## request.getName() = " + request.getName());
        System.out.println("## request.getEmail() = " + request.getEmail());
        System.out.println("## request.getOrganization() = " + request.getOrganization());

        MemberDto memberDto = new MemberDto(name, email, organization);

             return ResponseEntity.status(HttpStatus.OK).body(memberDto);
    }
    /* POST: 임의의 HTTP 헤더를 RequestBody와 함께 받는 경우*/
    @PostMapping(value = "/add-header")
    public ResponseEntity<MemberDto> addHeader(@RequestHeader("my-header") String header, @RequestBody MemberDto memberDto) {
        System.out.println(header);
        return ResponseEntity.status(HttpStatus.OK).header(header).body(memberDto);
    }

}

 

 

4. 결과

4.1 http://localhost:8080/web-client/post-with-param-and-body 요청

브라우저에 표시된 응답(요청 시 동반한 requestParam을 기반으로 수신측 서버가&nbsp; memberDto 객체를 만들어 회신하였다.)
수신 측 서버의 로그(param이 아니라 memberDto의 내용을 출력하였기 때문에 위의 이미지와 내용이 다르다.)

 

4.2 http://localhost:8080/web-client/post-with-header

브라우저에 표시된 응답( 요청 시 동반한 MemberDto 객체의 내용을 기반으로 수신 서버가 회신하였다. 따라서 dognails로 작성돼 있다.)
수신 측 서버의 로그( 헤더에서 "my-header" key에 대응되는&nbsp; value인 "catnails API"를 로그에 출력한다.)

 

Comments