코딩 기록들

스프링 입문 4.3 POST API 본문

스프링 입문

스프링 입문 4.3 POST API

코딩펭귄 2024. 1. 3. 15:13

POST API

 

- 매번생성하기때문에 멱등성x, 안정성x = 요청할때마다 데이터가 생성됨

- Query Parameter 생성할수는 있지만, 보통 잘 만들지 않음

- 데이터를 주고받을때 : XML, JSON 형태를 주로 웹에서 주고받음 (최근 : JSON 대부분 사용)

 

JSON 기본구조

- 괄호로 시작

- key : value로 값이 이루어짐

- string, number, boolean, object, array 형태가 있음 (모든값이 value에 세팅될수있음)

JSON

String : value
number : value
boolean : value 
object : value { }
array : value [ ] //같은값에 대한 반복

{
	"id" : "value"
}

-  json 규칙 1. snake case : 단어의 구별마다 언더바 _ 붙임 ex. phone_number

-  json 규칙 2. carmel case : phoneNumber

{
	"phone_number" : "value"
	"phoneNumber" : "value"
}

{
	"phone_number" : "010-1111-2222", //String : 따옴표로 묶어줌
    "age" : 10,
    "isAgree" : false 
    "account" : {
    	"email" : "sss.naver.com",
        "password" "1234"
    }
}


// user 조회하는 경우
//key값은 똑같고, value의 값이 다른 형태 (배열 형태로 리턴)

{
    "user_list" : [
        {
            "account" : "abcd",
            "password" : "1234"
        },{
            "account" : "qwer",
            "password" : "2345"
        }
    ]
}

- 배열이 들어가야 되면 해당 key의 배열선언을 해주고 안에 같은 key, value값을 가진 값들을 나열

 

 

예제만들어보기

//1. 요청에 대해서 어떻게 받아올 수 있을지

// 사용자가 계정 생성
{
  "account" : "",
  "email" : "",
  "password" : "",
  "address" : ""
}

 

방법1

1. 이렇게 구성하여 PostAPIController 만든다

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/api")
public class PostApiController {

    @PostMapping("/post")
    public void post(Map<String, Object> requestData){
        requestData.forEach((key, value) -> {
            System.out.println("key : " + key);
            System.out.println("value : " + value);
        });

    }
}

2. method를 post로 선택하고 해당 주소를 send 하면, 

-> Header에서 볼 수 있듯이 자동으로 Content-Type 이 json형태임 (기본적으로 application/json은 인코딩이 UTF-8 임)

 

3. 오른쪽 Body에 아래코드 넣기 -> 다시 send 버튼 누르기

 

 

 

 

방법 2

1. 새로운 dto 패키지및 파일 생성 (requestDto 객체 만들어주기)

package com.example.post.dto;

public class PostRequestDtp {
    private String account;
    private String email;
    private String address;
    private String password;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "PostRequestDtp{" +
                "account='" + account + '\'' +
                ", email='" + email + '\'' +
                ", address='" + address + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
위의 PostApiController 파일 아래와같이 수정

@RestController
@RequestMapping("/api")
public class PostApiController {
    @PostMapping("/post")
    public void post(@RequestBody PostRequestDto requestData){ // @RequestBod 꼭 써주기
        System.out.println(requestData);
    }

 

 

 

문제가 생기는 경우

보내는사람 : 자바, carmel case -> 보내는쪽 : snake case

ex) phoneNumber // phone_number

 

1. dto 파일에 아래코드 추가

    private String phoneNumber; // phone_number


    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

 

2. 실행시키고

3. 사이트에서 이렇게 입력하면

 phoneNumber = 'null' 이라고 출력됨. 이유 -> 디폴트가 carmel-case 따르기 때문!

 

해결방법 : @JsonProperty("phone_number") 추가

-> 이방법은 특정한 값이 snake case, carmel case 둘다 아닌 애매한 (ex. OTP) 변수에 특정 이름을 매칭할때 사용

    @JsonProperty("phone_number") //snake case
    private String phoneNumber; // phone_number