[GO] cURL JSON 전송 오류

타키탸키·2023년 1월 10일
0

GO-WEB

목록 보기
10/11

문제

cURL을 통해 POST 방식으로 서버에 JSON 데이터를 보내자 전송 데이터가 null로 출력되었다.

> curl -X POST -H "Content-Type: application/json" 
-d '{"Name":"James Bond","Gender":"male","Age":32,"Id":"777"}' http://localhost:8080/user

{"name":"","gender":"","age":0,"id":"007"}

문제가 된 코드는 다음과 같다.

u := models.User{}

json.NewDecoder(r.Body).Decode(&u)

// Change Id
u.Id = "007"

uj, _ := json.Marshal(u)

w.Header().Set("Content-Type", "application/x-www-form-urlencoded")
w.WriteHeader(http.StatusCreated) // 201
fmt.Fprintf(w, "%s\n", uj)

빈 구조체 User를 선언하고 그 안에 Request Body를 디코딩하여 넣어준다. 이때, 데이터의 출처를 확인하기 위해 임의로 Id의 값을 변경한다. 그 결과를 JSON으로 다시 마셜링한 후에 응답 data를 전송한다.

이는 전형적인 http 통신 과정이다. 원래대로라면 Body의 내용이 정상적으로 파싱되어 구조체의 멤버에 저장되고 그 결과를 마셜링하여 응답 데이터를 전송해야 한다.

코드 흐름 상, 디코딩 과정의 문제로 User 구조체에 데이터가 저장되지 못하고 선언한 그대로 빈 데이터가 넘어간 것 같았다(+ 중간에 확인 차 넣은 Id 값만이 구조체에 저장되었다).

처음에는 Request Body도 출력해봤지만 Body의 문제는 아니었다.

reqBody, _ := io.ReadAll(r.Body)
fmt.Println(string(reqBody))

계속 고민을 이어가던 중, 에러 처리 코드의 부재를 발견했다. 서둘러 에러 코드를 추가하고 에러를 확인해봤다.

출력된 에러 문구는 다음과 같다.

invalid character '\'' looking for beginning of value

\라면, 높은 확률로 이스케이프 시퀀스(escape sequence)와 관련된 문제였다. GET 요청에는 해당 문제가 발생하지 않고 POST 요청에만 발생한다는 것에서도 JSON 데이터와 관련된 문제임을 의심해볼 수 있었다. 이에 따라, cURL 명령어를 수정해보기도 하고 JSON 데이터에 \를 붙여보기도 했다. 하지만 해당 오류는 계속해서 발생했다.

해결

구글링을 해본 결과, 중국 사이트에서 같은 문제를 겪은 유저가 작성한 피드를 발견했다. 해당 글에 따르면, Windows의 CMD가 아닌 Git Bash로 명령어를 실행해보니 해당 에러가 발생하지 않았다는 것이다.

Git Bash와 POSTMAN으로 직접 확인해보니 문제 없이 동작하는 것을 발견했다.

결국은 Windows 명령 프롬프트에서만 발생한 문제였던 것이다!!! 혹시나 해서 PowerShell에서 확인해보니 동일한 에러가 발생했다.

사실 더 깊이 들어 가서 왜 Windows tool에서만 해당 문제가 발생하는지 알아보고 싶었지만 시간 관계상 다음으로 보류하기로 결정했다. 우선은 POSTMAN에서 요청을 전달하는 것으로 진행해야 겠다.

오늘의 결론

  1. 에러 처리 코드를 잊지 말자!
  2. 영어권 사이트 외에 다른 해외 사이트의 자료도 참고해보자!
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글