2016-08-06 9 views
15

エンドポイントにプレーンテキスト応答を返すHTTP GETリクエストを作成しています。プレーンテキストHTTPを処理するにはどうすればよいですか?

プレーンテキストレスポンスの文字列を取得するにはどうすればよいですか?

私のコードは次のようになります。身体の

url := "http://someurl.com" 
    response,err := http.Get(url) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer response.Body.Close() 

    responseString := //NOT SURE HOW TO GRAB THE PLAIN TEXT STRING 

答えて

26

レスポンスが着信バイトストリームからデータを読むことができる任意の方法を使用して読み取ることができます。 ioutilパッケージで提供されているReadAll関数が最も簡単です。

responseData,err := ioutil.ReadAll(response.Body) 
if err != nil { 
    log.Fatal(err) 
} 

[]バイトでAPI応答を得られます。レスポンスがプレーンテキストである場合、あなたは簡単に型変換を使用して文字列に変換することができます

responseString := string(responseData) 

し、その結果に

fmt.Println(responseString) 

を確認サンプルプログラム:

package main 

import (
    "fmt" 
    "io/ioutil" 
    "log" 
    "net/http" 
) 

func main() { 
    url := "http://country.io/capital.json" 
    response, err := http.Get(url) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer response.Body.Close() 

    responseData, err := ioutil.ReadAll(response.Body) 
    if err != nil { 
     log.Fatal(err) 
    } 

    responseString := string(responseData) 

    fmt.Println(responseString) 
} 
+1

スペイン語/イタリア語などのWebページを取得した場合は、 '[byte]を' string'に変換すると良い結果を得られません。まさに「é」、「á」などの文字は 文字になります。 'responseData'を繰り返し実行し、すべての文字を連結する必要があります。最適化された方法は[this](https://play.golang.org/p/IPKmytFOEd);-) –

+0

@Amdの答えは、以前のコメントと同じ方法でUnicodeテキストの問題を解決しますが、私はより良いと思います;-) –

2

使用ioutil.ReadAll(response.Body)

package main 

import (
    "bufio" 
    "bytes" 
    "fmt" 
    "log" 
    "net/http" 
) 

func main() { 
    response, err := http.Get("http://127.0.0.1") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer response.Body.Close() 

    scanner := bufio.NewScanner(response.Body) 
    scanner.Split(bufio.ScanRunes) 
    var buf bytes.Buffer 
    for scanner.Scan() { 
     buf.WriteString(scanner.Text()) 
    } 
    fmt.Println(buf.String()) 
} 

出力:

*Hello World* B=µH * 

このサンプルWebサーバのコード使用:

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
) 

func ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    body := "*Hello World* B=µH *" 
    fmt.Fprint(w, body) 
} 

func main() { 
    http.HandleFunc("/", ServeHTTP) 
    if err := http.ListenAndServe(":80", nil); err != nil { 
     log.Fatal(err) 
    } 
} 
+0

お返事ありがとうございます@Amd! 、私は文字列にUnicodeテキストのバイト配列をデコードする方法を知らなかったし、私にとっては頭痛だった... :-) –

+0

@ToniVillena励ましてくれてありがとう –

0

また、あなたは、このワーキングサンプルコードのようにbufio.NewScanner(response.Body)
を使用してUnicodeテキストを処理することができますio.Copy io.Readerからすべてのバイトを読み込み、io.Writerに書き込みます。

resp, err := http.Get(server.URL + "/v1/ping") 
if err != nil { 
    t.Errorf("failed to execute GET request: %s", err) 
} 
defer resp.Body.Close() 

var b bytes.Buffer 
if _, err := io.Copy(&b, resp.Body); err != nil { 
    t.Errorf("failed to copy response body: %s", err) 
} 

fmt.Println(b.String()) 
関連する問題