2017-01-09 4 views
1

Я пытаюсь создать веб-сервер, который будет работать как прокси. Мой сервер делает запросы (POST, GET ...) для клиента на конкретный сайт, получает ответ с этого сайта и передает его клиенту. Как я уже сказал, как прокси. Проблема в том, что в ответе от google.com например (или любого другого сайта) я не могу прочитать тело. Код состояния - 200, но когда я попытался прочитать содержимое тела, я получаю странные вещи.Как получить ответ тела в запросе в GO?

Это часть моего кода, что я сделать запрос

request, err := http.NewRequest(method, url, nil) 
for k, v := range m { 
    request.Header.Set(k, v) 
} 
if err != nil { 
    log.Fatalln(err.Error()) 
} 

client := http.Client{} 
resp, err := client.Do(request) 

if err != nil { 
    log.Fatalln(err.Error()) 
}else{ 

fmt.Println("=======================") 
fmt.Println(resp) 
fmt.Println("=======================") 
fmt.Println(resp.Body) 

И я получаю это:

======================= 
&{200 OK 200 HTTP/1.1 1 1 map[Date:[Mon, 09 Jan 2017 18:07:49 GMT] 
Cache-Control:[private, max-age=0] Content-Type:[text/html; 
charset=ISO-8859-1] P3p:[CP="This is not a P3P policy! See 
https://www.google.com/support/accounts/answer/151657?hl=en for more 
info."] Server:[gws] X-Xss-Protection:[1; mode=block] Expires:[-1] X- 
Frame-Options:[SAMEORIGIN] Set-Cookie:[NID=94=i5qZWuqYtrLAkc-amGHbmDnqx3Wg8mGx0kuk6s- 
gKWYMSNXbScl0Cb5GldDzGdfrIrJvHC3151JzHB2s3XLdmFN82- 
_gSxu07xwPNbVlzKiZgE9dJf7vXeXSaYQhWowv; expires=Tue, 11-Jul-2017 
18:07:49 GMT; path=/; domain=.google.com.br; HttpOnly]] 0xc4200cac20 
-1 [] false true map[] 0xc420126000 <nil>} 
======================= 
&{0xc420014700 <nil> <nil>} 
+2

Тело ответа - [io.ReadCloser] (https://godoc.org/io#ReadCloser). Покажите код, который вы используете для [чтения] (https://godoc.org/io#Reader.Read) тела. –

+0

Вы не пробовали читать тело, вы только что напечатали структуру Response.Body. – JimB

+0

Да, я думал, что содержание тела было в структуре Response.Body. Итак, как мне получить тело? – Vivi

ответ

4

Из документации https://golang.org/pkg/net/http/ прочитать ответ тела вы можете использовать пакет ioutil

Как:

resp, err := http.Get("http://example.com/") 
    if err != nil { 
     // handle error 
    } 
    defer resp.Body.Close() 
    body, err := ioutil.ReadAll(resp.Body) 
+0

вы можете _use_ 'ioutil' читать' io.Reader', но вы не _need_ его. – JimB

+0

Спасибо! Оно работает! – Vivi