Get request with body

회사에서 주소검색API를 만들었다.
나혼자 여러모로 테스트도 다 해보고 실제 붙여서 클라이언트에서도 호출하는 테스트를 다 마치고 실제 사용도 하고 있는데 ..

갑자기 다른 파트 개발자분이 내 API에서 에러를 뱉어낸다고 하네?! ㅜㅜ

찾아본 결과 GET request를 했는데 헤더에 Content-Type: application/json을 보낸 차이로 400 Bad Request 에러를 리턴했다.

아래는 경우에 따른 테스트 결과다.

GET 방식은 Content-Type을 명시하지 않고 URI로 데이터 처리하는게 기본 방식이다. 문제없이 200을 리턴한다.

Content-Type 헤더없이 URI로 데이터 전송

###
GET localhost:8088/api/search?keyword=여의도공원&limit&page=1
Response
GET http://localhost:8088/api/search?keyword=%EC%97%AC%EC%9D%98%EB%8F%84%EA%B3%B5%EC%9B%90&limit=&page=1

HTTP/1.1 200 OK
Date: Mon, 30 Aug 2021 06:28:12 GMT
Server: Apache/2.4.29 (Ubuntu)
Cache-control: no-store, max-age=0, no-cache
Debugbar-Time: 1630304894
Debugbar-Link: http://localhost:8088/?debugbar_time=1630304894
Content-Length: 1480
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=UTF-8

{
  "total": 1,
  "count": 1,
  "data": [
    {
      ....
    }
  ],
  "pagination": {
    "total": 1,
    "perPage": 5,
    "pageCount": 1,
    "currentPage": 1,
    "prev": null,
    "next": null,
    "first": 1,
    "last": 1
  }
}

Response code: 200 (OK); Time: 1670ms; Content length: 1308 bytes

Content-Type을 json으로 보냈는데 400 오류가 났다.
이 API는 CodeIgniter4를 사용해서 만들었는데 해당 프레임워크에서는 데이터 전송 시 Content-Type: application/json 헤더가 명시되어 있으면 body에 있는 데이터를 처리한다.
그래서 query로 keyword 데이터를 보냈음에도 body에 데이터가 없어서 keyword 데이터없음 에러를 리턴했다.

Content-Type 작성하고 URI로 데이터 전송

###
GET localhost:8088/api/search?keyword=여의도공원&limit&page=1
Content-Type: application/json
Response
GET http://localhost:8088/api/search?keyword=%EC%97%AC%EC%9D%98%EB%8F%84%EA%B3%B5%EC%9B%90&limit=&page=1

HTTP/1.1 400 Bad Request
Date: Mon, 30 Aug 2021 06:28:24 GMT
Server: Apache/2.4.29 (Ubuntu)
Cache-control: no-store, max-age=0, no-cache
Debugbar-Time: 1630304906
Debugbar-Link: http://localhost:8088/?debugbar_time=1630304906
Content-Length: 132
Connection: close
Content-Type: application/json; charset=UTF-8

{
  "status": 400,
  "error": 400,
  "messages": {
    "error": "{\"keyword\":\"The keyword field is required.\"}"
  }
}

Response code: 400 (Bad Request); Time: 1412ms; Content length: 132 bytes

GET 메서드를 사용할 때 경우에 따라서 json 데이터를 보내고 싶을 때도 있으니 Content-Type: application/json 헤더를 명시하고 아래처럼 body에 데이터를 넣어서 호출하면 오류없이 리턴된다.

Content-Type 작성하고 body로 데이터 전송

###
GET localhost:8088/api/search
Content-Type: application/json

{
  "keyword": "여의도공원",
  "limit": null,
  "page": 1
}
Response
GET http://localhost:8088/api/search

HTTP/1.1 200 OK
Date: Mon, 30 Aug 2021 06:28:29 GMT
Server: Apache/2.4.29 (Ubuntu)
Cache-control: no-store, max-age=0, no-cache
Debugbar-Time: 1630304911
Debugbar-Link: http://localhost:8088/?debugbar_time=1630304911
Content-Length: 1480
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json; charset=UTF-8

{
  "total": 1,
  "count": 1,
  "data": [
    {
      ...
    }
  ],
  "pagination": {
    "total": 1,
    "perPage": 5,
    "pageCount": 1,
    "currentPage": 1,
    "prev": null,
    "next": null,
    "first": 1,
    "last": 1
  }
}

Response code: 200 (OK); Time: 1711ms; Content length: 1308 bytes

CI외에도 다른 서버, 클라이언트들이 GET에서 body를 보내는 경우

  • POST로 인식을 하거나
  • 오류를 리턴하거나
  • 그냥 GET에서도 body를 처리해주거나

하는 경우가 있으니 사용하는 환경이나 협업하는 동료와 규칙을 정해서 개발하는 것이 좋겠다.

참고 블로그

몽환숲 별 호수 원형 극장 페어리 보관함

어둠땅 몽환숲 별 호수 원형 극장에 페어리 보관함 위치가 떠서 찾아갔다.
.. 아무리봐도 없는데 화살표 위로 되어 있어서 주변을 계속 찾아봤다.
찾느라 한바퀴 다 돌았네 ..

/way 39.90, 43.77

관중석에서 무대를 바라보고 왼쪽으로 돌아서 들어가면 탱글탱글 버섯이 있다.
탱글탱글 버섯뒤에 벽을 등지고 서서 버섯 먹고 점프! 날아서 지붕에 착지하면 지붕 끝 부분에 상자가 있다.

몽환숲에서 보관함이 떴는데 상자가 화살표 위쪽으로 표시되어있고 그 위치에 없다 싶으면 그 근처에서 탱글탱글 버섯을 찾고 그 상자 방향으로 가면 점프활공으로 상자를 먹을 수 있다!!

몽환숲 달의 시야 버프 받기!

야생씨앗 요람 타고 ㅎㅎ

어둠땅 몽환숲에서 그 유명한 ‘야생씨앗 요람’ 탈 것을 받고 나면 트윙클스타가 ‘달의 시야’라는 버프를 준다.

그냥 와우 시간이 밤이 돼서 어두워지는 거랑 다른 효과가 난다. 몽환숲의 요소들이 더 아름답게 빛난다.

예쁘게 빛나는 내 돈…아니 꽃

버프를 또 받고 싶으면 트윙클스타한테 가서 말 걸고 달라하면 된다!

트윙클스타는 티르너 바알에.
/way 63.91, 37.52