Go에서 HTTP 응답에 문자열로 액세스


123

웹 요청의 응답을 구문 분석하고 싶지만 문자열로 액세스하는 데 문제가 있습니다.

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답변 에서 이것은 변환입니다 ( spec 참조 ). zzzz가 언급 한
" 얼마나 비싸지 []byte(string)? "(역 문제이지만 동일한 결론이 적용됨)를 참조하십시오 .

일부 변환은 uint(myIntvar)비트를 제자리에서 재 해석 하는 캐스트와 동일 합니다.

소니아는 추가 :

바이트 슬라이스에서 문자열을 만들려면 반드시 힙에 문자열을 할당해야합니다. 불변 속성은 이것을 강제합니다.
때로는 [] byte로 최대한 많은 작업을 수행 한 다음 끝에 문자열을 생성하여 최적화 할 수 있습니다. 이 bytes.Buffer유형은 종종 유용합니다.


감사. 내가 어떻게 스스로 알아낼 수 있었는지 제안이 있습니까? string ()은 어떻게합니까? reflect.TypeOf로 볼 수없는 이유는 무엇입니까?
Tibor Szasz

1
@TiborSzasz 간단한 변환입니다 : blog.golang.org/slices#TOC_12를 참조하십시오 .
VonC

코드에 대한 작은 개선 http.StatusOK은 원시 200값 대신 사용하는 것입니다 !
Shadoninja 2017

나는 이것을하고 있고 내 요청 본문에는 항상 끝에 개행 문자가 있음을 발견했습니다. 요청 본문에 대한 정상 ioutil.ReadAll()입니까? 아니면 ??
sixty4bit

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.