Goで文字列としてHTTP応答にアクセスする


123

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応答をファイルに正しく書き込みます。

私はすでにパッケージのリファレンスを確認しましたが、あまり役に立ちません。

回答:


221

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回答)でコメントされているように、これは変換です仕様を参照)。zzzzが言及している
どのくらい高価です[]byte(string)か?」(逆の問題ですが、同じ結論が当てはまります)を参照してください。

一部の変換は、uint(myIntvar)所定のビットを再解釈するのようなキャストと同じです。

ソニアは追加します:

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


ありがとう。どうすれば自分でそれを理解できると思いますか?string()はそれをどのように行いますか?なぜreflect.TypeOfでそれを見ることができないのですか?
Tibor Szasz

1
@TiborSzaszこれは単純な変換です。blog.golang.org/ slicesTOC_12を参照してください。
VonC

コードの小さな改善http.StatusOKは、生の200値の代わりに使用することです!
Shadoninja 2017年

私はこれを行っており、私のリクエストボディには常に最後に改行文字があることがわかりました。これはリクエストボディにとって正常ですか、それとも原因ioutil.ReadAll()ですか?
sixty4bit 2018

29

HTTPボディの応答を読み取るために使用しているメソッドは、バイトスライスを返します。

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

公式ドキュメント

を使用[]byteして文字列に変換できます

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

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.