2017-03-10 1 views
3

에서 나는 이동에 GET 요청에서 XML을 읽기 힘든 시간을 보내고 있습니다. 방금 Go를 배우기 시작했으며이 주제에 대한 리소스를 찾지 못했습니다.읽기 XML은 Golang

response, err := http.Get(url) 
     if err != nil { 
      log.Fatal(err) 
     } else { 
      defer response.Body.Close() 
      xml, _ := ioutil.ReadAll(response.Body) 
      if err != nil { 
       log.Fatal(err) 
      } 
     } 

_, err := io.Copy(os.Stdout, response.Body) 일을하지만 추가 처리를 위해 XML을 저장하고 싶습니다 : 내가 뭘하려합니다. 도움을 주시면 대단히 감사하겠습니다. 당신이 무엇을 시도했다

답변

6

은 대부분 좋은입니다. 그것을 향상시키는 몇 가지 사항 :

http.Get()http.Response과 선택 사항 오류를 반환합니다. 오류가 없다면 이는 HTTP GET 조작이 성공했음을 의미하지만 서버가 오류 문서로 응답했을 수 있습니다. 따라서 응답 HTTP 상태 코드를 확인해야합니다.

또한 io.ReadAll()도 너무 있는지 확인하는 것을 잊지 마세요 (읽기 데이터 외에) 오류를 반환합니다.

의 함수에 포장 보자

func getXML(url string) (string, error) { 
    resp, err := http.Get(url) 
    if err != nil { 
     return "", fmt.Errorf("GET error: %v", err) 
    } 
    defer resp.Body.Close() 

    if resp.StatusCode != http.StatusOK { 
     return "", fmt.Errorf("Status error: %v", resp.StatusCode) 
    } 

    data, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     return "", fmt.Errorf("Read body: %v", err) 
    } 

    return string(data), nil 
} 

테스트/위의 함수 사용 :

if xmlStr, err := getXML("http://somehost.com/some.xml"); err != nil { 
    log.Printf("Failed to get XML: %v", err) 
} else { 
    log.Println("Received XML:") 
    log.Println(xmlStr) 
} 

는 또한 다른 응답의 내용을 얻을 같은 것이라고주의를, 그래서 string 변환 및 반환 유형을 "인코딩"하지 않는 것이 좋습니다. 이 사람은 더 일반적이다 :

if data, err := getContent("http://somehost.com/some.xml"); err != nil { 
    log.Printf("Failed to get XML: %v", err) 
} else { 
    log.Println("Received XML:") 
    log.Println(string(data)) 
} 
+0

는 상세 reponse 주셔서 감사합니다 :

func getContent(url string) ([]byte, error) { resp, err := http.Get(url) if err != nil { return nil, fmt.Errorf("GET error: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("Status error: %v", resp.StatusCode) } data, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("Read body: %v", err) } return data, nil } 

가 XML 문서를 얻기 위해 이것을 사용! 그것은 정말로 나의 날을 구했다. 나는 너무 적은 평판 때문에 대답을 업 그레이션 할 수 없었습니다 - 미안 해요! – leandermelms