코딩 기록들
스프링 입문 4.3 POST API 본문
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
'스프링 입문' 카테고리의 다른 글
스프링 입문 4.4 DELETE API (0) | 2024.01.05 |
---|---|
스프링 입문 4.3 PUT API (1) | 2024.01.05 |
스프링 입문 4.2 GET API (3) | 2024.01.03 |
스프링 입문 4.1 Hello World API 만들기 (Talend API Tester 사용) (0) | 2024.01.03 |
스프링 입문 3.3 URI 설계패턴 (1) | 2024.01.02 |