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 중국어 웹사이트의 기타 관련 기사를 참조하세요!