web-dev-qa-db-ja.com

Goで文字列としてHTTPレスポンスにアクセスする

Webリクエストのレスポンスを解析したいのですが、文字列としてアクセスできない。

func main() {
    resp, err := http.Get("http://google.hu/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)

    ioutil.WriteFile("dump", body, 0600)

    for i:= 0; i < len(body); i++ {
        fmt.Println( body[i] ) // This logs uint8 and prints numbers
    }

    fmt.Println( reflect.TypeOf(body) )
    fmt.Println("done")
}

レスポンスに文字列としてアクセスする方法は? ioutil.WriteFileは応答をファイルに正しく書き込みます。

私はすでにパッケージの参照を確認しましたが、あまり役に立ちません。

76
Tibor Szasz

bs := string(body)はあなたに文字列を与えるのに十分であるべきです。

そこから、通常の文字列として使用できます。

ちょっと このスレッドでは

var client http.Client
resp, err := client.Get(url)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

if resp.StatusCode == http.StatusOK {
    bodyBytes, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    bodyString := string(bodyBytes)
    log.Info(bodyString)
}

GoByExample もご覧ください。

下記のように(そして zzn 's answer に)コメントされているように、これは変換spec を参照).
[]byte(string)?== 」(逆の問題ですが、同じ結論が当てはまります)を参照してください。ここで、 zzzz は、

uint(myIntvar)のように一部の変換はキャストと同じです。これはビットを所定の位置に再解釈するだけです。

ソニア が追加されます。

バイトスライスから文字列を作成するには、文字列をヒープに割り当てる必要があります。不変性はこれを強制します。
[] byteを使ってできるだけ多くの作業を行い、最後に文字列を作成することで最適化できる場合があります。 bytes.Buffer タイプはしばしば便利です。

142
VonC

Http本体の応答を読み取るために使用しているメソッドはバイトスライスを返します。

func ReadAll(r io.Reader) ([]byte, error)

公式文書

次のようにして[]byteを文字列に変換できます。

body, err := ioutil.ReadAll(resp.Body)
bodyString := string(body)
19
tsabsch

string(byteslice)はバイトスライスを文字列に変換します。単に型変換だけでなく、メモリコピーでもあることを知ってください。

1
zzn