>백엔드 개발 >Golang >`ioutil.ReadAll(resp1.Body)`가 응답 본문을 읽은 후 `xml.NewDecoder(resp.Body).Decode`가 \'EOF\' 오류를 반환하는 이유는 무엇입니까?

`ioutil.ReadAll(resp1.Body)`가 응답 본문을 읽은 후 `xml.NewDecoder(resp.Body).Decode`가 \'EOF\' 오류를 반환하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-29 15:57:02711검색

Why does `xml.NewDecoder(resp.Body).Decode` return an

xml.NewDecoder(resp.Body).Decode의 EOF 오류

질문:

xml.NewDecoder(resp.Body).Decode를 사용하여 HTTP 응답에서 XML을 디코딩하려고 하면 xml.Unmarshal.

코드로 응답 본문이 성공적으로 디코딩되었음에도 불구하고 "EOF" 오류가 발생합니다. :

<code class="go">req1, err := http.NewRequest("GET", concat([]string{domain, defects_link}), nil)
error_handler(err)
req1.Close = true 

resp1, err := client.Do(req1)
error_handler(err)

fmt.Printf("\n %s \n", resp1.Status)

defer resp1.Body.Close()
conts1, err := ioutil.ReadAll(resp1.Body)
error_handler(err)
fmt.Println("Response Body is Here :", string(conts1))//Contents are Printed Here

if err := xml.NewDecoder(resp1.Body).Decode(&v); err != nil {
    fmt.Printf("error is : %v", err)
    return
}</code>

설명:

응답 본문이 ioutil에 의해 이미 소비되었기 때문에 "EOF"(파일 끝) 오류가 발생합니다. .ReadAll(resp1.Body) 이전 줄에 있습니다. 이 함수는 EOF까지 본문에서 모든 데이터를 읽고 xml.NewDecoder가 디코딩할 데이터를 남기지 않습니다.

해결책:

문제를 해결하려면 본문 콘텐츠가 다음과 같아야 합니다. xml.NewDecoder로 디코딩하기 전에 새 io.Reader에 복사됩니다. 이를 통해 여러 판독기가 본문 콘텐츠에 액세스할 수 있습니다.

한 가지 접근 방식은 bytes.NewReader를 사용하여 본문 콘텐츠에서 새 판독기를 생성하는 것입니다.

<code class="go">bodyBuffer := bytes.NewReader(conts1)
decoder := xml.NewDecoder(bodyBuffer)
err := decoder.Decode(&v)
if err != nil {
    fmt.Printf("error is : %v", err)
}</code>

또는 resp1.Body는 다음과 같습니다. resp1.Body.Seek(0, 0):

<code class="go">_, err = resp1.Body.Seek(0, 0)
if err != nil {
    fmt.Printf("error is : %v", err)
}

decoder := xml.NewDecoder(resp1.Body)
err = decoder.Decode(&v)
if err != nil {
    fmt.Printf("error is : %v", err)
}</code>
을 사용하여 초기 상태로 "되감기"

위 내용은 `ioutil.ReadAll(resp1.Body)`가 응답 본문을 읽은 후 `xml.NewDecoder(resp.Body).Decode`가 \'EOF\' 오류를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.