2016-06-18 22 views
2

I Client bin mit einem http behandelt einen json Körper, zu erhalten und es zu einem Byte-Array wieEOF Fehlerbeendigung zu verursachen, wenn in Verwendung http.Client.Get Verfahren und Body.Read() Methode in golang

client := new(http.Client) 
client.Timeout = time.Second * 10 
GetJobJson, err := client.Get(joblocation.String()) //where joblocation is of type *url.Url 
if err != nil { 
    errorlog.Err.Println("Error getting job from", joblocation.String(), err) 
    return false, http.StatusBadRequest, nil 
} 
buff := make([]byte, GetJobJson.ContentLength) 
length, err := GetJobJson.Body.Read(buff) //This returns an EOF error 
if err != nil { 
    errorlog.Err.Println("Error reading request body of length", length, "vs contentlength", GetJobJson.ContentLength, err) 
    return false, http.StatusBadRequest, nil 
} 
gelesen

In dem obigen Code, GetJobJson.Body ist vom Typ io.ReadCloser, die Reader implementiert, Read Verfahren mit, die ich hier als

length, err := GetJobJson.Body.Read(buff) 

Aber da ich Fehler am Umgang hier verwende, ist es ein Fehler zurückgegeben, die besagt, EOF.

Der HTTP-Endpunkt, an den ich die Anfrage sende, führt einen Apache-Server aus und erwähnt ihn hier, da ich nicht sicher bin, ob es darauf ankommt.

Wenn ich den Fehler nicht behandle, bekomme ich die komplette JSON-Stelle, die dort auf dem Remote-Server ist, und das Programm funktioniert wie erwartet.

Was ist der beste Weg, damit umzugehen? Ist die Read Methode, die ich verwende, schlecht für diese Situation? Bitte beraten.

Vielen Dank.

+0

EOF bedeutet, dass Sie den gesamten Stream lesen. Wenn Sie erhalten haben, was Sie erwartet haben, warum geben Sie diesen EOF als Fehler zurück? (Sie sollten auch beachten, dass es hier möglich ist, Chunked-Antworten zu erhalten, die keinen ContentLength haben) – JimB

+0

Danke @JimB. Ich gebe EOF nicht zurück. Es wird vom Webserver zurückgegeben, von dem ich den Inhalt abrufe. Was ist der beste Weg, es dann zu tun? Kann ich nur EOF ignorieren und damit umgehen? – nohup

+0

@ JimB: Könnte es sein, dass der tatsächliche Inhalt und die Inhaltslänge unterschiedlich sind? Ich habe eine 'unsafe.Sizeof (buff)' gemacht, die eine Größe kleiner als die 'ContentLength' Größe ergibt. – nohup

Antwort

1

Übergabe io.EOF ist Teil des Vertrages mit einem io.Reader, und es zeigt an, dass es nichts mehr zu lesen gibt. Wenn Sie gelesen haben, was Sie erwartet haben, gibt es keinen Fehler. Wenn Sie sich Funktionen wie ioutil.ReadAll ansehen, werden Sie sehen, dass es den EOF behandelt und am Ende des Streams keinen Fehler zurückgibt.

Sie sollten auch nicht nach ContentLength suchen, da es Sie daran hindert, Chunked-Antworten zu übergeben.