GET req 는 body가 아닌 param으로 정보 전달 - @RequestBody 대신 @RequestParam, @ModelAttribute

 

REST API 복습

- GET request에는 body가 없다

- POST PUT PATCH request에만 HTTP request body가 들어간다

 

axios docs를 보면 확실해진다 - https://axios-http.com/docs/api_intro

 

 

body가 필요 없는 get 등의 요청은 url만 받고,

axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
const fetchAll = async (params): Promise<Data[]> => {
	const response = await axios.get<Data[]>(URL, {
    	params // config에 params로 넣어줌
    })
    return response?.data ?? []
}

 

body가 들어갈 수 있는 (필수는 ❌ - 안 넣어줘도 된다) post put patch는 'data'라는 이름으로 body 넣어줄 수 있다

axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])
const save = async (body): Promise<Data | undefined> => {
  const response = await axios.post(URL, body)
  return response?.data
}

const update = async (body): Promise<void> =>
  await axios.patch(URL, body)

 

Q) patch, post 등에 object 넘겨줄 때 { data : 넘겨줄obj } 형태로 넘겨줘야 하지 않나? 아래 코드들은 그냥 obj 넘김

A) axios에선 url다음에 바로 plain object 넘겨주면 data로 인식

 

Docs 보면 When using the alias methods url, method, and data properties don't need to be specified in config. → 그렇게 해주면, config에 따로 적어줄 필요 없다는 이야기

 

 

 

Spring Controller

 

GET 요청은 param을 넘겨주니까, 컨트롤러에서도 @RequestBody가 아닌, @RequestParam 혹은 @ModelAttribute로 넘어오는 데이터를 받아야 한다!

// Previously
@GetMapping
public List<Data> fetchAll(@RequestBody requestDTO){
	return repository.find(requestDTO.toQuery());
}

// Now
@GetMapping
public List<Data> fetchAll(@ModelAttribute requestDTO){
	return repository.find(requestDTO.toQuery());
}

// 분해해서 (일부분만) 받기
@GetMapping
public List<Data> fetchAll(@RequestParam String id, @RequestParam int age){
	return repository.find(makeQuery(id, age));
}

 

+ Recent posts