json.NewDecoder().Decode()
질문:
에서 HTTP 컨텍스트 마감 기한을 무시했습니다. 🎜>context.WithTimeout을 사용하여 HTTP 요청에 대한 시간 제한을 설정할 때 ioutil.ReadAll 메서드는 요청을 중단하고 시간 초과가 초과되면 적절한 오류를 반환합니다. 그러나 json.NewDecoder(resp.Body).Decode는 마감일을 무시하고 context.DeadlineExceeded 대신 nil 오류를 반환하는 것으로 보입니다. 이것은 버그입니까?답변:
아니요, 이것은 버그가 아닙니다. net/http 패키지는 요청을 처리하기 위해 버퍼를 활용하므로 프로그램이 응답 본문을 읽기 전에 응답 본문의 일부 또는 전체를 버퍼로 읽을 가능성이 있습니다. 결과적으로 만료되는 컨텍스트로 인해 프로그램이 읽기 작업을 완료하는 것이 반드시 방해되는 것은 아닙니다.예:
의도적으로 응답을 지연시키는 수정된 HTTP 테스트 서버를 고려해 보세요. readDoesntFail을 사용하는 경우 서버는 부분 응답(10바이트)을 보내고 플러시한 후 나머지를 보내기 전에 6초를 기다립니다.ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { s := []byte(`{"ip":"12.34.56.78"}`) w.Write(s[:10]) if f, ok := w.(http.Flusher); ok { f.Flush() } time.Sleep(time.Second * 6) w.Write(s[10:])})) defer ts.Close()
결론:
json.Decoder.Decode()는 다음과 같은 경우 컨텍스트 최종 기한을 준수합니다. 데이터가 아직 버퍼링되지 않았습니다. 그러나 데이터가 부분적으로 또는 완전히 버퍼링된 경우 컨텍스트 최종 기한으로 인해 프로그램이 읽기 작업을 완료하지 못할 수 있습니다. 컨텍스트 기한에 따라 보다 일관된 동작을 위해 ioutil.ReadAll 또는 유사한 접근 방식을 사용하는 것이 좋습니다.위 내용은 `json.NewDecoder().Decode()`가 HTTP 컨텍스트 기한을 준수하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!