-
Golang: JSON <, >, & HTML 기호 escape 하기컴퓨터/Go language 2021. 2. 9. 15:42728x90반응형
Go
기본적으로 Marshal은 HTML 기호들을 escape를 안 한다. (&, >, <)
\u0026, \u003c, \u003e # &, <, >
그래서 링크 같은 string 데이터를 담고 있는 구조체를 marshal하려고 하면, (ex. http://something/data&view)
& (Ampersand)가 POST 결과에서 \u0026와 같은 유니코드로 바뀌어서 출력된다.
curl http://localhost:8000/entry -d "@data.json" # data.json POST to localhost:8000 http://something/data&view # 원하는 post 데이터 http://something/data\u0026view # 실제 post된 데이터
해결법
Buffer와 JSON Encoder을 만들어서 사용해야 한다.
아래는 <, >, & string 데이터를 넘겨도 그대로 넘겨지는 결과이다.
import "fmt" import "encoding/json" import "bytes" type Test struct { Hi string `json:"hi"` } func JSONMarshal(t interface{}) ([]byte, error) { buffer := &bytes.Buffer{} encoder := json.NewEncoder(buffer) encoder.SetEscapeHTML(false) err := encoder.Encode(t) return buffer.Bytes(), err } func main() { message := Test {} message.Hi = "<H5> google.com/data&view </H5>" fmt.Println("Before Marshal", message) messageJSON, _ := JSONMarshal(message) fmt.Println("After marshal", string(messageJSON)) } /* 결과 Before Marshal {<H5> google.com/data&view </H5>} After marshal {"hi":"<H5> google.com/data&view </H5>"} */
Go v1.7 버전 이상
err := e.marshal(v, encOpts{escapeHTML: true})
Gin-gonic
PureJSON을 사용하면 HTML Escape를 안하고 JSON을 넘긴다.
listCard := gin.H{"version": "2.0", "template": template} c.PureJSON(http.StatusOK, listCard)
Gin-gonic PureJSON 소스
Render 함수를 보면 NewEncoder를 사용해서 false 처리 한 후 HTML에 write를 시켜주었다.
// Render (PureJSON) writes custom ContentType and encodes the given interface object. func (r PureJSON) Render(w http.ResponseWriter) error { r.WriteContentType(w) encoder := json.NewEncoder(w) encoder.SetEscapeHTML(false) return encoder.Encode(r.Data) }
참고
728x90'컴퓨터 > Go language' 카테고리의 다른 글
Golang: soup를 이용한 네이버 날씨 정보 가져오기 (0) 2021.02.14 Golang: Nested structs to JSON (중첩 struct Json만들기) (0) 2021.01.03 Golang: gin으로 카카오 챗봇 서버 만들기 (2) 2021.01.01