본문 바로가기
Spring

Server to Server의 연결 - post

by step 1 2021. 6. 26.
반응형

URI 생성하는 방법: UriComponentsBuilder

expend()를 이용해서 uri상의 데이터를 추가한다.( , 를 추가하여 파라미터를 계속해서 추가해 줄 수 있다.)

// http://localhost:8081/api/server/user/{userId}/name/{userName}
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:8081")
                .path("api/server/user/{userId}/name/{userName}")
                .encode()
                .build()
                // post 방식일 경우 PathVariable 값을 추가하는 방법: expand
                .expand(100, "steve")
                .toUri();
        System.out.println(uri);

 

POST 방식으로 Server 호출하는 방법: RestTemplate

postForEntity을 이용하여 json 형식으로 반환 받는다.

// 진행 순서
        // http body -> object -> object mapper -> json -> rest template -> http body json
        UserRequest req = new UserRequest();
        req.setName("steve");
        req.setAge(10);

        RestTemplate restTemplate = new RestTemplate();
        // 응답을 어떻게 받을지 정한다.
        ResponseEntity<UserResponse> response = restTemplate.postForEntity(uri, req, UserResponse.class);

 

client에서 호출하는 코드

package com.example.client.contoller;

import com.example.client.dto.UserResponse;
import com.example.client.service.RestTemplateService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/client")
public class ApiController {

    private final RestTemplateService restTemplateService;

    public ApiController(RestTemplateService restTemplateService) {
        this.restTemplateService = restTemplateService;
    }

    @GetMapping("/hello")
    public UserResponse getHello(){
        // 서버로 호출
        return restTemplateService.post();
    }
}

 

Server URI를 호출하는 코드

package com.example.client.service;

import com.example.client.dto.UserRequest;
import com.example.client.dto.UserResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;

@Service
public class RestTemplateService {

    // get 방식
    // http://localhost:8081/api/server/hello
    // response
    public UserResponse hello(){
//        주소 만들기: http://localhost:8081/api/server/hello
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:8081")
                .path("/api/server/hello")
                // 주소에 값을 넣는 방법: queryParam
                // http://localhost:8081/api/server/hello?name=steve&age=10
                .queryParam("name", "steve")
                .queryParam("age", 10)
                .encode()
                .build()
                .toUri();

        System.out.println(uri.toString());

        RestTemplate restTemplate = new RestTemplate();
        // client가 되어 해당url의 서버를 호출한다. (get 방식, string으로 반환)
//        String result = restTemplate.getForObject(uri, String.class);

        // ResponseEntity 형식으로 호출
        //ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
        ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri, UserResponse.class);
        System.out.println(result.getStatusCode()); // 200 OK
        System.out.println(result.getBody()); // UserResponse(name=steve, age=10)
        return result.getBody();
    }
    
//  post 방식
    public UserResponse post(){

        // http://localhost:8081/api/server/user/{userId}/name/{userName}
        URI uri = UriComponentsBuilder
                .fromUriString("http://localhost:8081")
                .path("api/server/user/{userId}/name/{userName}")
                .encode()
                .build()
                // post 방식일 경우 PathVariable 값을 추가하는 방법: expand
                .expand(100, "steve")
                .toUri();
        System.out.println(uri);
        
        // 진행 순서
        // http body -> object -> object mapper -> json -> rest template -> http body json
        UserRequest req = new UserRequest();
        req.setName("steve");
        req.setAge(10);

        RestTemplate restTemplate = new RestTemplate();
        // 응답을 어떻게 받을지 정한다. json
        ResponseEntity<UserResponse> response = restTemplate.postForEntity(uri, req, UserResponse.class);
        System.out.println(response.getStatusCode());
        System.out.println(response.getHeaders());
        System.out.println(response.getBody());

        // String으로 반환되는 값 확인
        ResponseEntity<String> response2 = restTemplate.postForEntity(uri, req, String.class);
        System.out.println(response2.getStatusCode());
        System.out.println(response2.getHeaders());
        System.out.println(response2.getBody());

        return response.getBody();
    }
}

 

Server에서 데이터 받는 코드

@PathVariable을 이용해서 post로 전달된 데이터를 받는다.

package com.example.server.controller;

import com.example.server.dto.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping("/api/server")
public class ServerApiController {

    @GetMapping("/hello")
    public User hello(@RequestParam String name, @RequestParam int age){
        User user = new User();
        user.setName(name);
        user.setAge(age);
        return user;
    }

    @PostMapping("/user/{userId}/name/{userName}")
    public User post(@RequestBody User user, @PathVariable int userId, @PathVariable String userName){
        log.info("userId: {}, userName: {}",userId, userName );
        log.info("client req: {}", user);
        return user;
    }
}

 

확인

 

client 로그

 

Server 로그

반응형

'Spring' 카테고리의 다른 글

Server to Server의 연결 - Naver API 사용  (0) 2021.06.26
Server to Server의 연결 - header 값 지정하는 방법  (0) 2021.06.26
Server to Server의 연결 - get  (0) 2021.06.26
Exception 처리  (0) 2021.06.19
Custom Validation  (0) 2021.06.19