2017-01-16 10 views
0

私は外出してからしばらくしていましたが、私はドキュメントを読む方法を忘れてしまったようです。httpを使用する方法応答方法を読み込みますか?

私はこのようなGETリクエストをすれば...

resp, err := http.Get("https://example.com") 

私はその後、応答がio.ReadCloserタイプ(https://golang.org/pkg/io/#ReadCloser)であるBodyを持っていることがわかります。私はReadCloserがReaderCloserへのインターフェイスであることを知っています。

Readerインターフェイスを見ると、(https://golang.org/pkg/io/#Reader)にバイトを読み取るReadメソッドがあります。要約に

、HTTP Response自体がRead方法を有するReaderインタフェースを含んio.ReadCloserインターフェースである本体を有します。

私はこれをしようとすると、私はReadに応答がHTMLにバイトを、私は何も見えません期待が...

var html []byte 
num, err := resp.Body.Read(html) 
fmt.Println("\n\thtml: ", html) 
fmt.Printf("\n\tnum: %v, err: %v\n", num, err) 

出力:

html: [] 
num: 0, err: <nil> 

は、私はここで何をしないのですか?

+0

でこれをテストするように、あなたがに読むためにスペースを割り当てる必要がサンプルコードここで

package main import ( "fmt" "net/http" ) func main() { var p []byte resp, err := http.Get("http://httpbin.org/ip") if err != nil { fmt.Println("Error making request", err.Error()) return } if resp.ContentLength < 0 { fmt.Println("No Data returned") return } p = make([]byte, resp.ContentLength) resp.Body.Read(p) fmt.Println("Response\n", string(p)) } 

は文句を言わない、それを仕事に行く遊び場httpリクエストで、linkを果たしているセキュリティ対策です。あなたは無制限のスライスしか提供していないので、Readは何も_read_できません。 – JimB

+1

読み取りはlen(html)バイトまでをhtmlに読み込みます。ここではゼロです –

答えて

4

短いです答え:スライスhtmlを渡しています。lenは「0」、読み取りはlen(html)バイトまでhtmlになります

はここで読むには最大len読み込みhttps://golang.org/pkg/io/#Reader

(P)Pにバイトからの抜粋です。これは、バイト数 (0 < = n < = len(p))と発生したエラーを返します。 Read がn < len(p)を返したとしても、 呼び出し中にすべてのpをスクラッチスペースとして使用することがあります。いくつかのデータが利用可能であるがlen(p)バイトではない場合、Read は通常、より多くを待つ代わりに利用可能なものを返します。

今、あなたがかもしれないもののいずれかであるISE ioutil

body, err := ioutil.ReadAll(resp.Body) 

やレスポンスオブジェクトからContentLengthを取得し、ん。ContentLengthでhtmlスライスを初期化するようにコードを更新。ここでは、あなたのマシン

0

パッケージ "IO/ioutil" を使用してください:

import "io/ioutil" 
... 
body, err := ioutil.ReadAll(resp.Body) 
resp.Body.Close() 
fmt.Println(string(body) 
0

あなたは良いヘルパーが不足していると友人ReadAll()

あなたのコードすべきは次のようになります。

import "io/ioutil" 

resp, err := http.Get("https://example.com") 
// check err 

defer resp.Body.Close() // we have to close Body if we want to reuse the connection 

html, err := ioutil.ReadAll(resp.Body) 
// check err 

fmt.Println(string(html)) 
関連する問題